【问题标题】:Understanding how unit testing works了解单元测试的工作原理
【发布时间】:2015-12-10 11:05:08
【问题描述】:

我从未编写过单元测试,但我想在我的新项目中使用它们。这是我的代码示例:

public class UnitOfWork : IDisposable, IUnitOfWork
{
    private IDbContext context = new MyDbContext();

    private IUserRepository userRepository;

    public IUserRepository UserRepository 
    {
        get
        {
            if (this.userRepository== null)
            {
                this.userRepository = new UserRepository (context);
            }
            return userRepository;
        }
    }
}

public class UserController : Controller
{
    private IUnitOfWork unitOfWork;

    public UserController(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }

    public ActionResult GetSomeUsers () 
    {
        var users = unitOfWork.UserRepository.GetSomeUsers(/*Some condition*/);
        return View(users);
    }
}

让我们假设var users = unitOfWork.UserRepository.GetSomeUsers(/*Some condition*/); 里面有一些复杂的查询。 我想知道的第一件事是如何对该查询进行单元测试,我是否必须创建一个具有预定义记录并针对该数据库进行查询的单独数据库? 第二件事是如何仅使用模拟的 UserRepository 测试控制器方法?

如果你能写一个简短的例子或提供一些教程链接,那就太好了。

【问题讨论】:

  • 你为什么不检查一些开源项目测试并以它们为例? GitHub 中托管了大量 .NET 项目
  • 一个好的开始可能是研究集成测试和单元测试之间的区别。每个都有很多优点和缺点,我不会在这里讨论。但它有望以某种方式回答您关于是否在测试中包含数据库的问题。

标签: asp.net .net entity-framework unit-testing moq


【解决方案1】:
  • 我是否必须创建一个具有预定义记录的单独数据库并针对该数据库进行查询?

如果您希望实施集成测试,那么可以创建一个包含测试数据的数据库并对其进行查询。集成测试非常重要和有用。另一方面,如果您希望创建单元测试,那么您需要以某种方式模拟数据库访问,因为单元测试不与环境交互,而只是测试功能本身。

参见例如this answer 获取有关单元测试和集成测试之间差异的更多信息。


  • 如何使用模拟的 UserRepository 仅测试控制器方法?

假设GetSomeUsers 方法返回一个字符串列表,单元测试可能看起来像这样。高温

[TestMethod]
public void GetSomeUsers_WhenCalled_RetunsView()
{
    // Arrange
    Mock<IUnitOfWork> unitOfWorkMock = new Mock<IUnitOfWork>();
    Mock<IUserRepository> userRepositoryMock = new Mock<IUserRepository>();

    List<string> listOfFakeUsers = new List<string> { "John Doe", "etc." };
    userRepositoryMock.Setup(ur => ur.GetSomeUsers()).Returns(listOfFakeUsers);

    unitOfWorkMock.SetupGet(uow => uow.UserRepository).Returns(
                                                          () => userRepositoryMock.Object);
    UserController controller = new UserController(unitOfWorkMock.Object); 

    // Act
    ActionResult result = controller.GetSomeUsers();

    // Assert
    Assert.IsInstanceOfType(result, typeof(ViewResult));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多