/ / Build-Modell im Komponententest - asp.net-mvc, Komponententest, moq

Build-Modell im Komponententest - asp.net-mvc, Komponententest, moq

Wollte nur eine Anleitung, wie würde ich über Unit-Test die folgende Aktion gehen:

public ActionResult Index()
{
var model = _resolver.GetService<ISignUpViewModel>();
model.Location =  _resolver.GetService<ILocations>().getLocations(string area);
return PartialView("Login", model);
}


private IDependencyResolver _resolverMock;

[TestMethod]
public void SignUpTest()
{
var _resolverMock = new Mock<IDependencyResolver>();
var ctrl = new HomeController(_resolverMock.Object);
var signUpMock = new Mock<ISignUpViewModel>();
var LocationsMock = new Mock<ILocations>();

_resolverMock.Setup(m => m.GetService(It.IsAny<Type>())).Returns(
signUpMock.Object);

_resolverMock.Setup(m => m.GetService(It.IsAny<Type>())).Returns(
LocationsMock.Object);


DependencyResolver.SetResolver(resolverMock.Object);

ctrl.Index();
ctrl.ViewData.Model = signUpMock;
}

Wie baut man das Modell im Unit Test auf?

Wie kann ich die getLocations-Methode vom Resolver aufrufen?

Unsicher, wie das geht?

Antworten:

0 für die Antwort № 1

Ihr Heimcontroller ist nicht abhängig von einem IDependencyResolver gemäß Ihrem Code. Es ist in der Tat abhängig von einem ISignUpViewModel. Sie können also entweder eine davon in den Konstruktor übergeben oder eine ISignUpViewModelFactory. Also würde ich die Modellauflösung in eine Fabrikklasse umgestalten:

public class HomeController {

private readonly ISignUpViewModelFactory _modelFactory;

public HomeController(ISignUpViewModelFactory modelFactory){
_modelFactory = modelFactory;
}

public ActionResult Index()
{
return PartialView("Login", _modelFactory.Create(area));
}
}


public interface ISignUpViewModelFactory {
ISignUpViewModel Create(string area);
}

public class ProductionSignUpViewModelFactory : ISignUpViewModelFactory
{
public ISignUpViewModel Create(string area){
// create and return your models here
// if you still have to use a service locator in this factory then
// refactor some more until you get these dependencies out in the open.
}
}

public class MockSignUpViewModelFactory : ISignUpViewModelFactory
{
public ISignUpViewModel Create(string area){
return new SignUpViewModel();
}
}

In der Produktion hast du dein IOC injizieren Sie eine Instanz von ProductionSignUpViewModelFactory. Im Test übergeben Sie einen MockSignUpViewModelFactory.

Der Unterschied besteht darin, dass Sie mit dieser Methode nur die Aktion (d. H. Die Einheit) testen, während Sie mit der aktuellen Methode die Aktion UND Ihren Servicelokator testen _resolver Plus Sie haben die tatsächliche Abhängigkeit verdeckt, d. ISignUpViewModel nicht IDependencyResolver.

Wie in den Kommentaren in ProductionSignUpViewModelFactorywenn du ein spritzen musst IDependencyResolver in diese Fabrik, damit es funktioniert, dann machst du es wahrscheinlich immer noch falsch. Dann musst du dir was anschauen ProductionSignUpViewModelFactory muss eine Instanz von erstellen ISignUpViewModel und spritze das nicht ein IDependencyResolver.

Schließlich werden Sie an die Spitze Ihrer Abhängigkeitskette gelangen und Sie werden feststellen, dass das Testen von Einheiten sehr, sehr einfach wird. Es ist noch einfacher, wenn Sie zuerst die Tests erstellen, also TDD. :)