【发布时间】:2017-01-30 04:07:15
【问题描述】:
我有一个存在于 nuget 包中的基本抽象类,我正在为其实现一个具体类,如下所示:
public class MyConcreteClass : MyBaseAbstractClass<SomeType> {
public MyConcreteClass(IAnInterfaceOne interfaceOne, IAnInterfaceTwo interfaceTwo) : base(interfaceOne, interfaceTwo) { }
}
我像这样嘲笑这两个参数:
var mockFirst = new Mock<IAnInterfaceOne>();
var mockSecond = new Mock<IAnInterfaceTwo>();
具体类如下:
var mockConcrete = new Mock<MyConcreteClass>(mockFirst.Object, mockSecond.Object);
当我尝试访问mockConcrete 中的Object 属性时
var concreteObjectInstance = mockConcrete.Object
我得到一个FileNotFoundException、Could not load file or assembly 'Serilog.dll',VS 中的调试器指向异常来自何处的基本构造函数调用:
base(interfaceOne, interfaceTwo)
Castle.Core 和 Moq 版本:
<package id="Castle.Core" version="3.3.3" targetFramework="net452" />
<package id="Moq" version="4.5.21" targetFramework="net452" />
我已经搜索了基类所在的nuget包,并且没有serilog的引用或用法。我searched Castle.Core's repo and found many usages of serilog 我相信这是一个日志库。所以我对这个异常是如何发生的以及如何尝试解决它有点困惑,所以当我模拟我的对象时它不会抛出异常。
【问题讨论】:
-
您的具体类是被测系统还是您将其用作实际被测系统的依赖项?
-
具体类是我想模拟返回值的依赖项。我实际测试的内容使用它,但它只是一个依赖项。
-
如果您手动新建具体类并通过两个模拟,它是否也会失败。由于它已经是具体的,我看不出你想模拟什么,因为它已经在使用它的依赖项的模拟
var mockConcrete = new MyConcreteClass(mockFirst.Object, mockSecond.Object); -
所以我不想手动创建具体并传入两个模拟的原因是因为它有一个命中服务的方法。我想模拟该方法的返回值,这样它就不会出现并命中服务。
-
那么你的问题是设计。该服务是一个依赖项,然后也应该被抽象,以便您可以模拟它。就目前而言,您的具体类与该服务紧密耦合。应该注入该服务器。
标签: c# moq castle-dynamicproxy