模拟对象进行单元测试

时间:2011-06-05 08:06:35

标签: c# unit-testing mocking

  

可能重复:
  Hard-Coded Mock Objects vs Mocking Framework

我想我终于开始明白哪些单元测试要解决,但我仍然难以实现所有细节。我得出的结论是,我可能需要一个“模拟”(我使用这个术语,因为我不确定我需要一个像Moq这样的整个框架)对象来完成工作。

作为我一直在运行的问题的一个例子,考虑一下存储库模式(或类似)的实现。正如我目前所理解的,我需要(至少)测试每个Add()Get()Remove()类方法。这很好,除非我想测试Add()方法如何处理null引用。在这种情况下,我是否只是在测试项目中定义一个简单的类,并在适当的单元测试中将其实例设置为null

单元测试示例(插图):

[TestMethod]
public void TestAdd_Null()
{
    IRepository<MockObject> repository = (IRepository<MockObject>)(new Repository<MockObject>());
    MockObject testObject = null;

    repository.Add(testObject);

    Assert.IsNotNull(repository.Entity);
}

// I'm thinking I should implement something like this exclusively within the Test project.
// Is this reasonable? Or should I be looking into something else?
internal class MockObject
{
    public String Name { get; set; }
}

1 个答案:

答案 0 :(得分:1)

我甚至可以说软件测试就像The Matrix一样。没有人能够被告知软件测试是什么,你必须亲自看看它。大多数非信徒没有给予测试公平的机会,也从未尝试过进行一些测试。欢迎来到俱乐部!

关于测试的棘手问题是编写测试非常困难,有时候编写可测试代码也很有挑战性。然而,今天有很多很棒的工具和技术,你应该投资成为一名更好的软件工程师。

模拟提供你必须自己写的假人,嘲笑很方便。在这种情况下,您的存储库不是实际的持久性服务,在这种情况下,它只是提供了一个测试合同。如果不应该添加空引用,则应该有一个测试用例,期望这样的操作失败。我相信这是不言而喻的,但重要的是要对此进行测试。

像Moq这样的库在这里可能非常有用,因为虚拟存储库什么也不做,你真的想要在这里进行断言。我不知道在这里需要添加某些内容之后的属性Entity(除了可能更容易编写测试之外)。但我也认为这是断言预期行为的错误方式。

在某种程度上,您所做的实际上被称为集成测试,因为您没有使用模拟工厂测试隔离单元来测试两个组件之间的交互。这些类型的测试非常重要,但如果它们的设计不是可测试的,也很难处理。这就是为什么我们有依赖注入这样的东西。

您的问题实际上并不需要特定的答案,但您已走上正轨,我希望在进行软件测试时,这会给您一些洞察力和额外的信心。