c# - Asp.Net MVC 5 测试 IoC + 依赖注入(inject)

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

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

Controller :

Controller :

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

我如何在这个 Controller 中注入(inject)进入数据库并产生结果所需的数据?

最佳答案

I Want test this public ActionResult Index() but I don't know how to Inject those dependencies.

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

例如,根据你到目前为止所做的事情

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 Action 的测试只需要IWorkPlaceService,但是GetWorkPlaces 方法的调用需要假数据。因此,模拟被配置为在调用时返回对象列表并将其传递给 View 结果。

关于c# - Asp.Net MVC 5 测试 IoC + 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50451846/

相关文章:

c# - IIS 连接超时和连接字符串超时属性

c# - ZipArchive 在实时服务器上提供无效文件

ASP.Net - 每次单击按钮时都会调用 Page_Load 和 Page_Init?

unit-testing - 如何在 golang 中测试 io.writer?

python - 测试(unittest)变量是否是 python 中的非空字符串的正确方法?

c# - 确保一次最多运行一个进程

c# - 将面板保存为图像

c# - 将枚举值传递给函数

c# - 为 32 位和 64 位非托管 DLL 创建托管包装器

android - dexDebugTest 构建任务中出现 "The command line is too long"错误