Asp.Net MVC 5测试IoC +依赖注入

Pau*_*dim 1 c# asp.net unit-testing dependency-injection moq

我正在尝试测试我的项目.我以前从未使用过测试,我开始学习我想要一个帮助,在最简单的情况下我想测试这个,public ActionResult Index()但我不知道如何注入这些依赖项.

控制器:

控制器:

public class WorkPlacesController : Controller
{
    private readonly IWorkPlaceService workPlaceService;

    public WorkPlacesController(IWorkPlaceService workPlaceService)
    {
        this.workPlaceService = workPlaceService;
    }
    // GET: WorkPlaces
    public ActionResult Index()
    {
        var workPlaces = workPlaceService.GetWorkPlaces(includedRelated:  
        true);

        return View(workPlaces);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的服务

服务

public class WorkPlaceService : IWorkPlaceService
{
    private readonly IWorkPlaceRepository workPlacesRepository;
    private readonly IUnitOfWork unitOfWork;


    public WorkPlaceService(IWorkPlaceRepository workPlacesRepository, IUnitOfWork unitOfWork)
    {
        this.workPlacesRepository = workPlacesRepository;
        this.unitOfWork = unitOfWork;
    }
}

public interface IWorkPlaceService
{
    IEnumerable<WorkPlace> GetWorkPlaces(string workPlaceDescription = null, bool includedRelated = true);
}
Run Code Online (Sandbox Code Playgroud)

还有我的存储库

知识库

public class WorkPlaceRepository : RepositoryBase<WorkPlace>, IWorkPlaceRepository
{
    public WorkPlaceRepository(IDbFactory dbFactory)
            : base(dbFactory) { }


    public WorkPlace GetWorkPlaceByDescription(string workPlaceDescription)
    {
        var workPlace = this.DbContext.WorkPlaces.Where(c => c.Description == workPlaceDescription).FirstOrDefault();

        return workPlace;
    }
}

public interface IWorkPlaceRepository : IRepository<WorkPlace>
{
    WorkPlace GetWorkPlaceByDescription(string workPlaceDescription);


}
Run Code Online (Sandbox Code Playgroud)

public class DbFactory : Disposable, IDbFactory
{
    AgendaEntities dbContext;

    public AgendaEntities Init()
    {
        return dbContext ?? (dbContext = new AgendaEntities());
    }

    protected override void DisposeCore()
    {
        if (dbContext != null)
            dbContext.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

我试着这样做:

public void BasicIndexTest()
{
    // Arrange
    var mockRepository = new Mock<IWorkPlaceService>();
    var controller = new WorkPlacesController(mockRepository.Object);
    // Act
    ActionResult actionResult = controller.Index() as ViewResult;           
    // Assert
    Assert.IsInstanceOfType(actionResult, typeof(List<WorkPlace>));
}
Run Code Online (Sandbox Code Playgroud)

如何在此控制器中注入进入数据库并带来结果的数据?

Nko*_*osi 5

我想测试这个公共ActionResult索引(),但我不知道如何注入这些依赖项.

模拟测试控制器所需依赖关系的行为,并在执行测试时断言所需的行为.

例如,根据您目前所做的工作

public void BasicIndexTest() {
    // Arrange
    var mockService = new Mock<IWorkPlaceService>();
    var workPlaces = new List<WorkPlace>() {
        new WorkPlace()
    };
    mockService
        .Setup(_ => _.GetWorkPlaces(It.IsAny<string>(), It.IsAny<bool>()))
        .Returns(workPlaces);

    var controller = new WorkPlacesController(mockService.Object);

    // Act
    var actionResult = controller.Index() as ViewResult;

    // Assert
    Assert.IsNotNull(actionResult);
    var model = actionResult.Model;
    Assert.IsNotNull(model)
    Assert.IsInstanceOfType(model, typeof(List<WorkPlace>));
    Assert.AreEqual(workPlaces, model);
}
Run Code Online (Sandbox Code Playgroud)

IWorkPlaceService测试Index操作只需要操作,但是调用GetWorkPlaces方法需要伪造数据.因此,mock被配置为在调用时返回对象列表并将其传递给视图结果.