【问题标题】:Mock a large Partial Class模拟一个大型的部分类
【发布时间】:2018-10-23 20:03:54
【问题描述】:

我想对具有 3 个数据库调用的 Controller 方法进行单元测试。但是每个数据库调用都是通过询问一个名为 DAL 的大型 Partial Class 文件来完成的。 Dal 类有 70 种方法!我是否必须创建一个具有 70 种方法的接口,以便 DAL 类可以使用;所以我可以用模拟切换它?或者有没有更好的解决方案来模拟这个 DAL 类?

【问题讨论】:

  • 如果你走接口的方式,你可以做几个小接口,让DAL实现所有的。通过这种方式,您可以对依赖项和单元测试进行“分类”。
  • 您为什么不从 DAL 类派生并为您的 Controller 方法实现自己的特定接口,而不是使用 Partial。这样你就可以访问这两个世界,但你仍然可以模拟你想要的部分,而不必担心 DAL 类。
  • 以 Moq 为例,您只需要模拟您调用的方法。因此,您可以使用 Visual Studio 提取您的巨型界面,然后只模拟您希望在测试用例中调用的方法。

标签: c# unit-testing mocking partial-classes


【解决方案1】:

有一个免费的 C# 模拟库,称为 Moq(mock-u 或 mock),可以通过 Nuget 获得。它允许使用 lambda 表达式和各种验证调用进行非常强大的模拟控制。您不需要指定比您需要的更多的方法定义,并且每个方法的行为可以在每次调用时完全改变。

https://www.nuget.org/packages/moq/

https://github.com/Moq/moq4/wiki/Quickstart

我个人可以保证 Moq 非常棒。

【讨论】:

  • 是的,我将 Moq 列为首选(有许多不同的模拟框架可用,但我绝对最喜欢 Moq)。顺便说一句,我认为您应该在答案中添加一些关于如何通过 Edit | Refactor | Extract Interface 使用 Visual Studio 从类中自动提取接口的内容。
  • 谢谢。有时间我会检查起订量。
【解决方案2】:

拥有一个包含 70 个方法的庞大类必然会产生这样的问题。无需重构您的 DAL 类,例如在较小的存储库中,您可以使用每个控制器所需的少数方法创建较小的接口,并让您的 DAL 类实现许多这些较小的接口。然后你可以只模拟你想要的接口,让你的控制器也依赖这个接口。

它可能看起来像:

interface A {
    void DoAThing();
}
interface B {
    void DoBThing();
}
class Mock : A {
    public void DoAThing() {
        //fake it till you make it       
    }
}
class DAL : A, B {
    //Way too many methods here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多