我想我终于开始明白哪些单元测试要解决,但我仍然难以实现所有细节。我得出的结论是,我可能需要一个“模拟”(我使用这个术语,因为我不确定我需要一个像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; }
}
答案 0 :(得分:1)
我甚至可以说软件测试就像The Matrix一样。没有人能够被告知软件测试是什么,你必须亲自看看它。大多数非信徒没有给予测试公平的机会,也从未尝试过进行一些测试。欢迎来到俱乐部!
关于测试的棘手问题是编写测试非常困难,有时候编写可测试代码也很有挑战性。然而,今天有很多很棒的工具和技术,你应该投资成为一名更好的软件工程师。
模拟提供你必须自己写的假人,嘲笑很方便。在这种情况下,您的存储库不是实际的持久性服务,在这种情况下,它只是提供了一个测试合同。如果不应该添加空引用,则应该有一个测试用例,期望这样的操作失败。我相信这是不言而喻的,但重要的是要对此进行测试。
像Moq这样的库在这里可能非常有用,因为虚拟存储库什么也不做,你真的想要在这里进行断言。我不知道在这里需要添加某些内容之后的属性Entity
(除了可能更容易编写测试之外)。但我也认为这是断言预期行为的错误方式。
在某种程度上,您所做的实际上被称为集成测试,因为您没有使用模拟工厂测试隔离单元来测试两个组件之间的交互。这些类型的测试非常重要,但如果它们的设计不是可测试的,也很难处理。这就是为什么我们有依赖注入这样的东西。
您的问题实际上并不需要特定的答案,但您已走上正轨,我希望在进行软件测试时,这会给您一些洞察力和额外的信心。