我注意到,当我在做TDD时,它经常导致非常大量的接口.对于具有依赖项的类,它们以通常的方式通过构造函数注入:
public class SomeClass
{
public SomeClass(IDependencyA first, IDependency second)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
结果是几乎每个类都将实现一个接口.
是的,代码将被解耦并且可以非常容易地进行单独测试,但是还会有额外的间接级别让我觉得有点......不安.有些事情感觉不对劲.
任何人都可以分享其他不涉及如此大量使用接口的方法吗?
你们其他人怎么样?
由于我是TDD新手,我目前正在开发一个小型C#控制台应用程序以便练习(因为练习很完美,对吧?).我首先简单地描述了如何组织应用程序(按类),并开始逐个开发我可以识别的所有域类(当然先测试).
最后,必须将类集成在一起以使应用程序可运行,即在Main方法中放置必要的代码,调用必要的逻辑.但是,我不知道如何以"先测试"的方式完成最后的整合步骤.
我想如果我使用"自上而下"的方法,我不会遇到这些问题.问题是:我该怎么做?我应该通过测试Main()方法开始吗?
如果有人能给我一些指示,我将非常感激.
当使用AssertWasCalled以验证是否已使用特定参数调用方法时,恕我直言,Rhino Mocks会生成不明确的诊断消息.
例:
interface ISomeInterface
{
void Write(string s);
}
[TestFixture]
public class SomeTests
{
[Test]
public void WriteShouldBeCalledWithCorrectArguments()
{
// Arrange
var mock = MockRepository.GenerateMock<ISomeInterface>();
var sut = new SomeClass(mock);
// Act
sut.DoSomething();
// Assert
mock.AssertWasCalled(x => x.Write(Arg<string>.Is.Equal("hello")));
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果测试失败并显示此消息...
Rhino.Mocks.Exceptions.ExpectationViolationException:ISomeInterface.Write(等于hello); 期望#1,实际#0.
......你不知道它是否失败,因为
A.'Write'永远不会被调用 - 或 -
B.'Write'实际上是调用的,但参数不正确
如果B是导致失败的原因那么如果消息读取的内容会更加清晰:
Rhino.Mocks.Exceptions.ExpectationViolationException:ISomeInterface.Write(string arg):调用了方法,但参数不正确:预期:hello,Actual:bye
我可以自己解决这个缺点(通过某种方式为Rhino编写自定义匹配器)或者我只需要编写一个手动模拟器吗?