【问题标题】:Asp.Net MVC 5 Testing IoC + Dependency InjectionAsp.Net MVC 5 测试 IoC + 依赖注入
【发布时间】:2018-10-31 06:53:42
【问题描述】:

我正在尝试测试我的项目。我以前从未使用过测试,我开始学习我需要帮助,在最简单的情况下我想测试这个 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);
    }
}

这是我的服务

服务

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

还有我的仓库

存储库

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


}

工厂

public class DbFactory : Disposable, IDbFactory
{
    AgendaEntities dbContext;

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

    protected override void DisposeCore()
    {
        if (dbContext != null)
            dbContext.Dispose();
    }
}

我试图做这样的事情:

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

我如何在这个控制器中注入需要进入数据库并带来结果的数据?

【问题讨论】:

  • 模拟测试所需的控制器依赖项,并在执行测试时断言所需的行为。

标签: c# asp.net unit-testing dependency-injection moq


【解决方案1】:

我想测试这个公共 ActionResult Index() 但我不知道如何注入这些依赖项。

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

例如,基于你目前所做的事情

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

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

【讨论】:

  • 谢谢 Mkosi,我想我现在明白了,所以我只是在测试界面。所以我不需要从数据库中获取数据。我想我明白了,我刚才在方法 var actionResult = controller.Index () as ViewResult; 中出现错误。但我会解决它!非常感谢
  • @PauloJardim 您使用模拟接口单独测试控制器操作,而不会影响实际实现问题。
  • 另外,你知道这个错误的任何原因吗? System.IO.FileNotFoundException:无法加载文件或程序集“System.Web.WebPages,版本=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。该系统找不到指定的文件。当我将 var actionResult = controller.Index() 的结果返回为 ViewResult;
  • 检查测试项目是否引用了必要的库。它可能正在寻找 ViewResult 类。清理并重建项目,看看它是否解决了问题。
  • 工作,我不得不使用来自 web 项目的相同 System.web.mvc dll。
猜你喜欢
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
相关资源
最近更新 更多