C# 模拟一个大的局部类
我想对具有3个数据库调用的控制器方法进行单元测试。但是每个数据库调用都是通过询问一个很大的部分类文件来完成的,该文件名为DAL。Dal类有70种方法!我是否必须制作一个包含70个方法的接口,DAL类可以使用它;这样我就可以用模拟来切换了?还是有更好的方法来模拟这个DAL类?拥有一个包含70个方法的大型类肯定会产生这样的问题。无需重构DAL类,例如在较小的存储库中,您可以使用每个控制器所需的少量方法创建较小的接口,并让DAL类实现许多较小的接口。然后,您可以只模拟您想要的接口,并让您的控制器也依赖于此接口 它可能看起来像:C# 模拟一个大的局部类,c#,unit-testing,mocking,partial-classes,C#,Unit Testing,Mocking,Partial Classes,我想对具有3个数据库调用的控制器方法进行单元测试。但是每个数据库调用都是通过询问一个很大的部分类文件来完成的,该文件名为DAL。Dal类有70种方法!我是否必须制作一个包含70个方法的接口,DAL类可以使用它;这样我就可以用模拟来切换了?还是有更好的方法来模拟这个DAL类?拥有一个包含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
}
拥有一个包含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
}
有一个免费的C#mock库,名为Moq(mock-u或mock),可以通过Nuget获得。它允许使用lambda表达式和各种验证调用进行非常强大的模拟控制。您不需要指定比需要更多的方法定义,每个方法的行为在每次调用中都可以完全更改
我个人可以保证Moq是惊人的。有一个免费的C#Moq模拟库(mock-u或mock),可以通过Nuget获得。它允许使用lambda表达式和各种验证调用进行非常强大的模拟控制。您不需要指定比需要更多的方法定义,每个方法的行为在每次调用中都可以完全更改
我个人可以保证Moq是令人惊奇的。如果你采用接口方式,你可以制作几个小接口,让DAL实现所有接口。通过这种方式,您可以对依赖项和单元测试进行“分类”。与其使用分部测试,不如从DAL类派生并为控制器方法实现自己的特定接口。这样,您可以访问这两个世界,但仍然可以模拟所需的部分,而不必担心DAL类。因此,您可以使用VisualStudio提取您的巨型接口,然后只模拟您希望在测试用例中调用的方法。如果您按照接口的方式,您可以制作几个小接口,并让DAL实现将它们全部调用。通过这种方式,您可以对依赖项和单元测试进行“分类”。与其使用分部测试,不如从DAL类派生并为控制器方法实现自己的特定接口。这样,您可以访问这两个世界,但仍然可以模拟所需的部分,而不必担心DAL类。因此,您可以使用VisualStudio提取巨大的界面,然后只模拟您希望在测试用例中调用的方法。是的,我支持Moq(有很多不同的模拟框架可用,但我绝对最喜欢Moq)。顺便说一句,我认为您应该在回答中添加一些关于如何通过
Edit | Refactor | extract interface
)使用Visual Studio从类中自动提取接口的内容。谢谢。我会在有时间的时候查看Moq。是的,我支持Moq(有很多不同的模拟框架可用,但我肯定最喜欢Moq)。顺便说一句,我认为您应该在回答中添加一些关于如何通过Edit | Refactor | extract interface
)使用Visual Studio从类中自动提取接口的内容。谢谢。当我有时间的时候,我会检查最小起订量。