TDD:.NET遵循TDD原则,模拟/不模拟?

Mar*_*tin 4 .net c# tdd mocking

我正在尝试跟踪TDD,我遇到了一个小问题.我编写了一个Test来将新用户插入数据库.在MyService类上调用Insert new user,因此我继续创建mytest.它失败了,我开始在我的MyService类上实现我的CreateUser方法.

我遇到的问题是MyService将调用存储库(另一个类)来进行数据库插入.

所以我想我会使用一个模拟框架来模拟这个Repository类,但这是正确的方法吗?

这意味着我必须更改我的测试以实际为我的用户存储库创建一个模拟.但这是推荐的吗?我最初写了我的测试并使它失败了,现在我意识到我需要一个存储库并需要模拟它,所以我不得不改变我的测试以满足模拟对象.闻起来有点?

我想在这里得到一些反馈.

如果这是要走的路,那么什么时候才能创建实际的用户存储库?这需要自己的测试吗?

或者我应该忘记嘲笑任何东西?但是,这将被归类为集成测试而不是单元测试,因为我将MyService和User Repository一起作为一个单元进行测试.

我有点失落; 我想以正确的方式开始.

Ser*_*kiy 6

所以我想我会使用一个模拟框架来模拟这个Repository类,但这是正确的方法吗?

是的,这是一种完全正确的方法,因为您应该单独测试您的类.即通过模拟所有依赖项.否则,您无法判断您的类是否失败或是否存在某些依赖关系.

我最初写了我的测试并使它失败了,现在我意识到我需要一个存储库并需要模拟它,所以我不得不改变我的测试以满足模拟对象.闻起来有点?

提取类,重组方法等是一种重构.测试可以帮助您进行重构,消除对变化的恐惧.如果实施发生变化,更改测试是完全正常的.我相信你不认为你可以从你的第一次尝试创建完美的代码,永远不会再改变它?

如果这是要走的路,那么什么时候才能创建实际的用户存储库?这需要自己的测试吗?

您将在应用程序中创建一个真实的存储库.您可以为此存储库编写测试(即检查它是否正确调用了底层数据访问提供程序,应该对其进行模拟).但是这样的测试通常非常耗时且易碎.因此,最好编写一些验收测试,它们使用真实的存储库来运行整个应用程序.

或者我应该忘记嘲笑任何东西?

恰恰相反 - 你应该使用模拟来单独测试类.如果模拟需要大量工作(数据访问,ui),那么不要模拟这样的资源并在集成或验收测试中使用真实对象.