gpt4 book ai didi

c# 模拟接口(interface) vs 模拟类

转载 作者:行者123 更新时间:2023-11-30 14:22:19 26 4
gpt4 key购买 nike

我是 .net 中最小起订量框架的新手。从我的在线研究来看,似乎有两种方法可以使用这个框架。模拟接口(interface)或模拟具体类。似乎在模拟具体类时,只能模拟 virtual 方法。就我而言,我只想模拟实现接口(interface)的类的几个方法。

例如,如果我们有以下内容:

public interface Ifoo
{
int Bar();
}

public class Foo : Ifoo
{
public virtual int Bar()
{
return 0;
}
}

public class Client
{
public Client(Ifoo foo)
{
var temp = foo.Bar();
}
}

现在如果我需要对客户端进行单元测试,我需要在构造函数中传递一个模拟的 Ifoo 对象。在这种情况下,我应该怎么做:

var mock = new Mock<Ifoo>();

var mock = new Mock<Foo>();

这对我的情况有影响吗?模拟接口(interface)与模拟类的优缺点是什么?对我来说,模拟接口(interface)总是一个更好的解决方案,因为模拟一个类只能模拟 virtual 方法。

最佳答案

这里有几点需要考虑:

  • 您的客户使用 IFoo,因此您应该模拟它。
  • 如果您的客户端使用具体类,您应该考虑重构您的客户端以使用接口(interface)或抽象类,而不是遵守 SOLID 原则。
  • 如果您的客户端在您的测试期间使用 Foo 的模拟而不是接口(interface),并且它依赖于该测试中的某些非模拟行为,那么您并不是真正在编写单元测试,因为您正在测试的行为不止一个单元。
  • 如果您的客户端在测试期间不使用任何非模拟行为,那么您也可以通过模拟接口(interface)。

tldr:类应该使用接口(interface)或抽象类而不是具体类。测试应该模拟接口(interface)或抽象类而不是具体类。

关于c# 模拟接口(interface) vs 模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50282374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com