我嘲笑了一个类并传递了如下参数:
var myClass = new Mock<MyClass>(a.Object, c.Object, b.Object);
这是MyClass
class MyClass : A
{
public override void Execute(IDictionary<string, object> parameters)
{
....
}
}
class A : AbstractClass
{
public override void Execute()
{
}
}
我在单元测试中调用Execute方法:
myClass.Object.Execute();
问题是,它似乎执行了该方法,但没有达到我在Execute
的{{1}}方法主体内所做的断点。
当我在没有Moq的情况下实例化MyClass
并调用MyClass
时,它将到达断点。
更新
为进一步说明,我(在提出问题之前)已经尝试使用Execute
,但没有用。我知道Mock的理念,也是出于好奇,为什么当它开始时它不起作用!
答案 0 :(得分:2)
您可以尝试使用:
myClass.Setup(m => m.Execute(It.IsAny<IDictionary<string, object>>())).CallBase();
或者在创建模拟实例时,将此CallBase参数传递给它。
myClass= new Mock<MyClass>(a.Object, c.Object, b.Object) { CallBase = true };
有关更多信息,您可以在自定义模拟行为部分中查看moq wiki。 希望对您有帮助。
UPD。
这是我为测试您的情况而编写的代码。我可以说,它达到了myClass的断点。
public abstract class AbstractClass
{
public abstract void Execute(IDictionary<string, object> parameters);
}
public class A : AbstractClass
{
public override void Execute(IDictionary<string, object> parameters)
{
int i = 0;
}
}
public class MyClass : A
{
public override void Execute(IDictionary<string, object> parameters)
{
int i = 0;
Console.WriteLine(i);
}
}
public class Tests
{
[Fact]
public void TestAbstractClass()
{
var myClass = new Mock<MyClass>() {CallBase = true};
myClass.Object.Execute(new Dictionary<string, object>());
}
}
答案 1 :(得分:0)
我好奇为什么开始时它不起作用
这是由moq
设计的。
正如我已经说过的,模拟为每种模拟类型创建代理,仅注意接口,非密封类和abstract \ virtual方法是可以模拟的,因为它只是继承了基类,因此每个调用都基于关于安装行为。因此,如果您模拟该类,则将具有以下内容:
var myClass = new MyClass(); // it is the instance of MyClass
var myClassMock = new Mock<MyClass>(); // it is the instance of MyClassProxy : MyClass
这些类型不同,如果调用myClass.Execute()
,则您将清楚地调用实现,但是如果调用myClassMock.Object.Execute()
,则将结束于代理类。如果您未进行任何设置,则代理类的默认行为是返回default(T)
,但是您可以设置其他行为,例如:
MyClass
来调用基础CallBase
.Setup(...).Throws<TException>()
.Setup(...).Returns(value)