gpt4 book ai didi

c# - 如何使用 Mock.Of<> 语法模拟在构造函数中具有参数的类?

转载 作者:太空宇宙 更新时间:2023-11-03 22:42:52 25 4
gpt4 key购买 nike

question向我展示了如何模拟在构造函数中具有参数的类。这是一个 nice block postMock.Of<> 上,但它没有显示如何使用函数语法模拟构造函数。

public class MyClass
{
public MyClass(IDependency1 dep1, IDependency2 dep2, IDependency3 dep3)
{}

public ReturnType MyNewMethod(Tyep1 t1, Type2 t2)
{
//1. call to ExistingMethod1();
//2. call to ExistingMethod2();
//3. call using the DbContext
//4. call using the Logger
}
}

根据第一篇博文,我得到了类似的结果。

var dep1 = new Mock<IDependency1>(); 
var dep2 = new Mock<IDependency2>();
var dep3 = new Mock<IDependency3>();

object[] arrParams = { dep1.Object, dep2.Object, dep3.Object }
var sut = new Mock<MyClass>(arrParams);

那么如何使用Mock.Of<>模拟一个在构造函数中有参数的类语法?

编辑

新方法不仅会调用现有方法,还会访问DbContext , logger ,也许还有其他服务。因此,除了我正在测试的方法之外,我需要模拟所有内容。

public class MyClass
{
public MyClass(MyDbContext context, ISecurityService secService, ILogger logger)
{}

public ReturnType1 ExistingMethod1(Type1 t1){}

public ReturnType2 ExistingMethod2(Type t){}

public MyEntity MyNewMethod(Tyep1 t1, Type2 t2)
{
//1. call to ExistingMethod1(); --> I'll just setup the return value
//2. call to ExistingMethod2(); --> I'll just setup the return value
//3. call using the DbContext --> ???
//4. call using the Logger --> ???

var x = ExistingMethod1(t1); //1.
var y = ExistingMethod1(x); //2.

var result context.MyEntities. //3.
.Where(e => e.id == y.MyEntityId)
.ToList();

return result;
}
}

最佳答案

使用 Moq 模拟需要模拟的类具有虚拟方法,或者您可以模拟任何接口(interface)。当您使用 moq 进行模拟时,它会动态创建一个动态实现,因此它不依赖于您的实现。在你的情况下你可以做

public class MyClass
{
public MyClass(IDependency1 dep1, IDependency2 dep2, IDependency3 dep3)
{}

public ReturnType MyNewMethod(Tyep1 t1, Type2 t2)
{
//1. call to ExistingMethod1(); --> I'll just setup the return value
//2. call to ExistingMethod2(); --> I'll just setup the return value
//3. call using the DbContext --> ???
//4. call using the Logger --> ???
}
}

Mock<MyClass> mockedObj = new Mock<MyClass>();

mockedObj.SetUp(x=>x.MyNewMethod()).Returns(objectOfReturnType);

这里需要将 MyNewMethod 虚拟化。返回的 objectOfReturnType 是您创建为测试对象的对象。因此不需要或不需要您的方法主体细节。这就是模拟的想法,你正在用假实现模拟你的实际实现(在这种情况下是设置)。您可以根据您将如何测试被测类来改变不同的返回对象。我建议你先阅读单元测试 101。

请注意,您正在设置 MyNewMethod 的行为方式。您的实现可能会做很多事情,但在这里您关心的是它的返回。这就是为什么该方法也必须是虚拟的,它将被最小起订量覆盖并返回您刚刚设置的内容。在内部,该方法可能会调用不同的东西......所以你不在乎

你还应该阅读 Moq 的基础知识,你可以在这里找到它 https://github.com/Moq/moq4/wiki/Quickstart

关于c# - 如何使用 Mock.Of<> 语法模拟在构造函数中具有参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51427555/

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