我在编写测试套件时试图遵循良好的做法.中途我意识到我花了很多(大部分)时间在假物体上...我的大多数测试都是这样的
public interface ITemplateRepository
{
string get GetGenericTemplate {get;}
}
Run Code Online (Sandbox Code Playgroud)
public FakeTemplateRepository : ITemplateRepository
{
public string GetGenericTemplate ()
{
return "<xml>Complex</xml>";
}
}
Run Code Online (Sandbox Code Playgroud)
[Test]
public void CanGetGenericTemplate()
{
ITemplateRepository rep = new FakeTemplateRepository();
Assert.IsNotNull(rep.GetGenericTemplate());
}
Run Code Online (Sandbox Code Playgroud)
[Test]
public void GetGenericTemplateContains()
{
ITemplateRepository rep = new FakeTemplateRepository();
Assert.IsTrue(rep.GetGenericTemplate().StartsWith("<xml>"));
}
Run Code Online (Sandbox Code Playgroud)
我实际上发现自己花了很多时间在FakeTemplateRepository上,确保它返回了我期待的实际内容.这是坏事吗?
这仍然是有效的单元测试吗?单元测试应该快速而简单,不是吗?但老实说,我不太确定,有一点可以肯定的是,它让我思考了数据的形状和内容.FakeRepository中的内容或多或少会反映我的制作内容,尽管是从文件系统中读取而不是在内存中.
如果事实上我正在做的是集成测试,那么我应该如何使用模拟进行单元测试呢?
对我(如果使用Mocks)我没有意义,我设置了期望,以便它调用方法并返回一个字符串?我错过了什么,但我没有看到太多的价值吗?如果我设置了无效的方法名称,代码甚至不会编译!
我真的对整个事情感到困惑,而且我对单元测试的看法现在已经完全模糊了所有这些概念.
任何人都可以用一个超级简单的例子展示假货和模拟如何融入套房吗?例如什么应该是单元测试,什么应该是集成测试?
谢谢
我正在Java中实现一个模型,它需要迭代一个集合并经历一些识别阶段,它涉及到循环,而循环等.这是我想在细粒度级别测试的那种东西,所以我有信心它已得到妥善实施.
我用它作为开始单元测试的机会,因为我认为它对我的代码有益.从那以后,我一直在阅读一本书籍,以便快速掌握JUnit和单元测试.
基本上我的问题归结为我收到的两条相互矛盾的建议:
1)静力学是邪恶的.不要碰静电.不要测试私有,你可能想要一个类.
2)使用工厂进行创建以允许使用参数进行依赖注入 - 可能允许使用模拟和存根进行隔离.
在我的例子中,我希望执行以下操作:
double height = 223.42; // this was set iterating over a collection of doubles
//blah
HeightBounds b = HeightBounds.getHeightBounds(height);
//more blah
Run Code Online (Sandbox Code Playgroud)
我这样做是为了避免构建一个非常长而复杂的代码块,我只能对其进行全面测试.这样我就可以测试公共可访问对象,以确保系统组件都能正确执行.
常识告诉我,静态工厂没有任何问题,并且它们很容易测试,但是在我学习测试驱动设计时,我是否遗漏了一些令人眼花缭乱的东西?
谢谢