- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这question向我展示了如何模拟在构造函数中具有参数的类。这是一个 nice block post在 Mock.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/
我是一名优秀的程序员,十分优秀!