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

标签 c# .net mocking tdd

我正在尝试遵循 TDD,但遇到了一个小问题。我写了一个测试来将一个新用户插入到数据库中。 Insert new user 在 MyService 类上被调用,所以我继续创建了 mytest。它失败了,我开始在我的 MyService 类上实现我的 CreateUser 方法。

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

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

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

我希望在这里得到一些反馈。

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

或者我应该忘记 mock 什么?但是这将被归类为集成测试而不是单元测试,因为我会将 MyService 和 User Repository 作为一个单元一起测试。

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

最佳答案

So I figured I would use a mocking framework to mock out this Repository class, but is this the correct way to go?

是的,这是一个完全正确的方法,因为你应该单独测试你的类。 IE。通过模拟所有依赖项。否则你无法判断你的类是否失败或者它的某些依赖项。

I wrote my test initially and made it fail and now I realize I need a repository and need to mock it out, so I am having to change my test to cater for the mocked object. Smells a bit?

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

If this is the way to go then when would I create the actual User Repository? Would this need its own test?

您将在您的应用程序中创建一个真正的存储库。你可以为这个存储库编写测试(即检查它是否正确调用底层数据访问提供程序,它应该被模拟)。但此类测试通常非常耗时且脆弱。因此,最好编写一些验收测试,用真实的存储库测试整个应用程序。

Or should I just forget about mocking anything?

恰恰相反——你应该使用模拟来单独测试类。如果模拟需要大量工作(数据访问、用户界面),那么不要模拟此类资源并在集成或验收测试中使用真实对象。

关于c# - TDD:.NET 遵循 TDD 原则,模拟/不模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302338/

相关文章:

c# - 如何通过字符串或整数获取枚举值

c# - SpinWait 与 sleep 等待。使用哪一个?

c# - C#中如何防止非法ICloneable<T>继承?

javascript - 在 javascript 或 C#/.NET 中转义 unicode (%u2014)?

c# - 是否有可能在堆栈大小和可能溢出方面有太多方法?

c# - 向所有查询 Entity Framework 添加过滤器

c# - Entity Framework Code First 中的日期比较帮助

Perl 模块 Test::MockModule 和调用者

ruby-on-rails - 没有数据库的 Rspec 测试

python - 如何模拟一个深度为两个导入的 Python 类?