c# - 使用 Moq 模拟接口(interface)时,方法会发生什么变化?

标签 c# testing moq

当使用 Moq 模拟接口(interface)时,方法会发生什么变化?

假设我有一个接口(interface) ISomething , IoC 映射到类 Something .然后在我的测试中我这样做:var something = new Mock<ISomething>(); .

假设接口(interface)包含一个方法: string method(); .

现在,如果我在模拟实例上调用该方法,something.method() , 它会被映射到类 Something的实现,还是只会返回 void? Moq 会尝试将接口(interface)与实现映射吗?

最佳答案

Moq 不会尝试使用您的实现,事实上它对此一无所知(甚至不关心它是否存在)。相反,它在运行时生成它自己的类,它实现您的接口(interface) ISomething。它的实现是您使用 something.Setup() 方法配置的。

如果你跳过配置它,它只会返回默认值而不做任何其他事情。例如,

var something = new Mock<ISomething>();
var result = something.Object.method(); // returns NULL

var somethingElse = new Mock<ISomething>();
somethingElse.Setup(s=>s.method()).Returns("Hello World");
var otherResult = somethingElse.Object.method(); // Returns "Hello World"

设置可能非常复杂,如果您需要的话,包括为不同的参数或不同的调用返回不同的结果(第一次返回一个值,第二次调用 - 另一个)。更多详情可以查看documentation .

请注意,something.ObjectsomethingElse.ObjectISomething 接口(interface)的完全不同的实现(类)。您可以通过调用来检查:

var whatMySomethingIs = something.Object.GetType();
var whatMySomethingElseIs = somethingElse.Object.GetType();

关于c# - 使用 Moq 模拟接口(interface)时,方法会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50063283/

相关文章:

C# 代码压缩工具和技术

.net - Specflow 设置延迟

php - Symfony 爬虫 selectButton 方法无法获取表单

c# - 在 C# 中模拟 StreamReader 以进行单元测试

c# - Azure 辅助角色和 Blob 存储 C# - Microsoft.WindowsAzure.Storage.StorageException : The remote server returned an error: (400) Bad Request

c# - 要求表单例份验证

c# - 扩展多个 HttpWebRequests?

css - 每次推送新代码时测试页面设计

c# - 使用 Moq 模拟构造函数?

c# - 如何对基于枚举的 switch 语句的默认情况进行单元测试