2017-06-05 3 views
1

Völlig neu zu Tests, habe ich einen Controller wie folgt aus:Wie schreibe ich einen einfachen Testfall mit XUnit?

public class CheckRegController : Controller 
{ 
    private readonly ApplicationDbContext _context; 
    private readonly AppSettings _appSettings; 

    public CheckRegController(ApplicationDbContext context, IOptions<AppSettings> appSettings) 
    { 
     _context = context; 
     _appSettings = appSettings.Value; 
    } 

    [HttpGet] 
    public IActionResult Get(string var1, int numberusers) 
    { 
     //... 
    } 
} 

Jetzt habe ich ein Testprojekt hinzugefügt, in dem ich XUnit und Moq zu verwenden versuche. Ich wollte nur ein Objekt des Controller erstellen, wie ich in einem sehr einfachen Projekt gemacht habe, aber es funktioniert nicht in this.When Ich habe versucht:

CheckRegController cr = new CheckRegController(); 

Dort heißt es:

Es gibt kein Argument angegeben, die auf den erforderlichen formalen Parameter 'Kontext' von 'CheckRegController.CheckRegController ( ioptions ApplicationDbContext,)' entspricht XUnitTestProjectOA

Th Ich habe versucht:

var moqHome = new Mock<ApplicationDbContext>(); 

aber ich weiß nicht, ist es richtig oder nicht ODER was muss ich tun, bevor? Wie passiert man _context und _appsettings?

Antwort

0

Sie waren auf dem richtigen Weg. Mock die Abhängigkeiten und injizieren sie in das zu testende Objekt.

//Arrange 
var dbmock = new Mock<ApplicationDbContext>(); 
//...setup dbmock as needed to exercise test 
var options = new Mock<IOption<AppSetting>(); 
var appSetting = new AppSetting { 
    //...populate appSetting as needed to exercise test 
}; 
options.Setup(_ => _.Value).Returns(appSetting); 

var sut = new CheckRegController(dbMock.Object, options.Object); 
var var1 = "testing"; 
var numberusers = 2; 

//Act 
var actual = sut.Get(var1,numberusers) 

//Assert 
//...assert expected behavior to actual. 

Ich würde auch vorschlagen, den Kontext abstrahieren, um den Controller auch wartbarer zu machen.

+0

Das ist genau das, was ich will ... aber bei UnitTestProject, wir verwenden [Testmethod] Attribut und auf Testfall klicken wir jeden Testfall aber in XUnitTestCase laufen können, ich habe [Fact] Attribut, und ich bin nicht in der Lage zu den Testfall ausführen? Wie man es laufen lässt? Ich verwende den Befehl: dotnet test -method namespace.projectname.methodname? aber es funktioniert nicht. – Mogli

+0

Es gibt mir den Fehler auf dbmock.object dass- Castle.DynamicProxy.InvalidProxyConstructorArgumentsException: ‚Kann nicht Proxy-Klasse instanziiert: abc.Data.ApplicationDbContext.? – Mogli

+0

@Mogli Deshalb habe ich empfohlen, den DB-Kontext zu abstrahieren, um mehr Flexibilität zu ermöglichen. – Nkosi

Verwandte Themen