/ / Model budowy w teście jednostkowym - asp.net-mvc, testowanie jednostkowe, moq

Zbuduj model w teście jednostkowym - asp.net-mvc, testowanie jednostkowe, moq

Chciałem tylko wskazówek, w jaki sposób chciałbym przejść do jednostki testującej następujące działanie:

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;
}

Jak budujesz model w teście jednostkowym?

Jak również wywołać metodę getLocations z resolvera?

Nie jesteś pewien, jak to zrobić?

Odpowiedzi:

0 dla odpowiedzi № 1

Twój domowy kontroler nie jest zależny od IDependencyResolver zgodnie z kodem. W rzeczywistości zależy to od ISignUpViewModel. Możesz więc przekazać jedną z nich do konstruktora lub ISignUpViewModelFactory. Więc chciałbym przekształcić model rozdzielczości na klasę fabryczną:

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();
}
}

W produkcji masz swoje IOC wstrzyknąć przykład ProductionSignUpViewModelFactory. W teście przekazujesz a MockSignUpViewModelFactory.

Różnica polega na tym, że za pomocą tej metody testujesz tylko działanie (tj. Jednostkę), podczas gdy przy użyciu aktualnej metody testujesz działanie I twój servicelocator _resolver plus "zasłoniłeś rzeczywistą zależność, tj. ISignUpViewModel nie IDependencyResolver.

Zgodnie z komentarzem w ProductionSignUpViewModelFactory, jeśli musisz wstrzyknąć IDependencyResolver do tej fabryki, aby to działało, prawdopodobnie nadal robisz to źle. Następnie musisz spojrzeć na to ProductionSignUpViewModelFactory musi utworzyć instancję ISignUpViewModel i wstrzyknąć, że nie IDependencyResolver.

W końcu dostaniesz się na szczyt łańcucha zależności, a testy jednostek staną się bardzo, bardzo łatwe. Jest jeszcze łatwiej, jeśli najpierw zbudujesz testy, tj. TDD. :)