0

我有一个 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);
}
4

3 回答 3

3

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

您应该尝试实现一个数据库沙箱来测试您的存储库功能。

于 2012-07-12T19:55:51.090 回答
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。这些测试也很脆弱并且非常耗时。但是在这种情况下,您可以肯定,该存储库可以正常工作。
于 2012-07-13T00:11:50.780 回答
0

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

于 2012-07-12T19:59:39.283 回答