moq,如何测试保存方法?

时间:2012-07-12 19:48:54

标签: c# unit-testing moq

我有一个save()方法,不太确定如何测试。下面是我的代码。

public interface IRepository<T>
{
    T Get(int id);
    void Save(T item);
    void Delete(int id);
}

save方法不返回任何值,我无法比较该值。但是,我已经有4个用户,在添加另一个用户之后,我只检查用户总数,是否足以测试它?

[Test]
public void Add_a_new_smoothie_user_should_return_total_5_users()
{
    // Arrange

    var totalUsers = _users.Count();

    _mockUserRepository.Setup(s => s.Save(It.IsAny<User>()))
        .Callback((User user) => _users.Add(user));

    var newUser = new User
                      {
                          Id = 3,
                          Email = "newuser@test.com",
                          Password = "1234567".Hash(),
                          Firstname = "",
                          Lastname = "",

                          CreatedDate = DateTime.Now,
                          LastLogin = DateTime.Now,

                          AccountType = AccountType.Smoothie,
                          DisplayName = "",
                          Avatar = "",
                          ThirdPartyId = "",
                          Status = Status.Approved,
                          Ip = "127.0.0.1"
                      };

    // Act

    _mockUserRepository.Object.Save(newUser);

    // Assert

    Assert.AreEqual(5, _users.Count());
    Assert.AreEqual(1, _users.Count() - totalUsers);
}

3 个答案:

答案 0 :(得分:3)

您正在嘲笑您要测试的功能部分。除了您持有用户的数据类型的Add()方法之外,这些测试都不会被证明。最后,如果您的存储库正在运行,它不会给出任何想法。

您应该尝试实施Database Sandbox来测试您的存储库功能。

答案 1 :(得分:1)

永远不要为模拟代码编写测试,因为那些测试实际上并没有测试任何东西(好吧,除了模拟框架实现)。

如何使用测试优先方法创建接口?这很简单。考虑您有一些FooController,这需要一些数据。在某些时候(在为控制器编写测试期间),您决定会有一些依赖关系,它会将这些数据提供给控制器(是的,存储库)。您当前的控制器测试需要一些功能才能从数据存储中获取一些Bar对象。所以,你写测试

Mock<IBarRepository> repositoryMock = new Mock<IBarRepository>();
repositoryMock.Setup(r => r.GetById(It.IsAny<int>()).Returns(new Bar());
FooController controller = new FooController(repositoryMock.Object);
controller.Exercise();

此测试无法编译,因为此时您没有控制器需要的IBarRepository接口。您创建此接口。您还可以在此界面中添加方法GetById。之后,您实现控制器。

好消息 - 当控制器完成后,您将拥有IBarRepository接口定义,其中API非常便于控制器使用。

下一步是创建IBarRepository实施。我很少为存储库编写测试。但是,您可以通过以下几种方式实现:

  • 如果您拥有存储库(ORM框架,ADO.NET类等)使用的数据访问代码,则可以模拟这些依赖关系并验证您的存储库实现是否对基础数据访问代码进行了所有必需的调用。这些测试非常脆弱。并且不会给您带来太多好处,因为很少有存储库包含复杂的业务逻辑。
  • 您可以使用真实数据库(例如内存中的SQLite)进行集成测试,并验证数据是否真的在数据库表中进行了CRUD。这些测试也很脆弱且非常耗时。但在这种情况下,您将确定,该存储库可以正常工作。

答案 2 :(得分:0)

您的存储库正在保存?如果它保存在某个文件中,那么您可以将您的文件与某些模型文件(黄金)进行比较,其中一切都是手动检查并且没问题。如果是某个数据库,则应该模拟数据库接口,记录所有插入查询,然后将日志与理想日志进行比较。