我有一个类处理帐户的东西。它提供了登录,重置密码和创建新账户的方法。TDD - 我做得对吗?
我通过构造函数注入依赖关系。我有验证每个依赖项的引用的测试,如果引用为null,它会引发一个ArgumentNullException。
Account类通过只读属性公开每个这些依赖关系,然后我有测试来验证在构造函数上传递的引用是否与属性返回相同。我这样做是为了确保参考资料是由班级持有的。 (我不知道这是否也是一种好的做法。)
第一个问题:这是TDD的一个好习惯吗?我问这个,因为这个类到目前为止有6个依赖关系,并且它非常重复,而且测试也很长,因为我必须模拟每个测试的所有依赖关系。我所做的只是每次复制和粘贴,只需更改正在测试的依赖项的引用即可。第二个问题:我的账户创建方法执行如验证通过的模型,将数据插入3个不同的表或第四个表(如果存在某组值并发送电子邮件)。我应该在这里测试什么?到目前为止,我有一个测试,检查模型验证是否得到执行,如果调用每个存储库的Add方法,并且在这种情况下,我使用模拟存储库的Moq的回调方法来比较每个添加到存储库的属性我通过模型传递的。
喜欢的东西:
userRepository
.Setup(r => r.Add(It.IsAny<User>()))
.Callback<User>(u =>
{
Assert.AreEqual(model.Email, u.Email);
Assert.IsNotNull(u.PasswordHash);
//...
})
.Verifiable();
正如我所说,这些测试越来越长,我认为它不会伤害测试任何东西我可以,但我不知道这是值得的,因为它编写测试需要时间。
“这是很好的TDD吗?”真的是错误的问题;更有用的问题是“这是否适合我和我的项目?”像TDD这样的方法论,尽管有什么狂热分子会让你觉得这是一种达到目的的手段,而不是自己的目的。 – Casey 2014-09-24 03:57:48
-1这不是一个TDD的问题,它是一个单元测试的设计问题。 – gurun 2014-09-26 13:58:28
这是我的2美分。我不会将您的依赖作为属性公开。我看到了这种被开发者滥用的事情。在过去他们使用依赖关系的属性暴露他们的类内的依赖关系(根本不漂亮)。如果组装SUT类变得单调乏味,可以使用工厂方法创建SUT类,或者更好地使用测试生成器模式。 – Andrew 2014-09-26 20:39:09