gpt4 book ai didi

moq - 要模拟一个对象,它必须是实现接口(interface)还是标记为虚拟的?

转载 作者:行者123 更新时间:2023-12-04 13:12:34 29 4
gpt4 key购买 nike

还是该类也可以实现抽象类?

最佳答案

要模拟一个类型,它必须是接口(interface)(这也称为纯虚拟)或具有虚拟成员(抽象成员也是虚拟的)。

根据这个定义,你可以模拟所有虚拟的东西。

本质上,动态模拟 不要做任何你不能用手做的事情 .

假设您正在针对这样的接口(interface)进行编程:

public interface IMyInterface
{
string Foo(string s);
}

您可以手动创建 IMyInterface 的特定于测试的实现,该实现忽略输入参数并始终返回相同的输出:
public class MyClass : IMyInterface
{
public string Foo(string s)
{
return "Bar";
}
}

但是,如果您想测试消费者如何响应不同的返回值,这将变得非常重复,所以不要编写您的 。测试 double 手动,您可以让框架为您动态创建它们。

想象一下,动态模拟确实编写了类似于上面的 MyClass 实现的代码(它们实际上并不编写代码,它们动态地发出类型,但这是一个足够准确的类比)。

以下是如何使用 Moq 定义与 MyClass 相同的行为:
var mock = new Mock<IMyInterface>();
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar");

在这两种情况下,创建类的构造函数都会在对象创建时被调用。由于接口(interface)没有构造函数,这通常是默认构造函数(分别属于 MyClass 和动态发出的类)。

您可以对具体类型执行相同的操作,例如:
public class MyBase
{
public virtual string Ploeh()
{
return "Fnaah";
}
}

手动,您将能够从 MyBase 派生并覆盖 Ploeh 方法,因为它是虚拟的:
public class TestSpecificChild : MyBase
{
public override string Ploeh()
{
return "Ndøh";
}
}

动态模拟库可以做同样的事情,抽象方法也是如此。

但是,您不能编写覆盖非虚拟或内部成员的代码,动态模拟也不能。他们只能做你用手能做的事情。

警告:上述描述对于大多数动态模拟都是正确的,除了 TypeMock,它是不同的并且......可怕。

关于moq - 要模拟一个对象,它必须是实现接口(interface)还是标记为虚拟的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1972831/

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