【发布时间】:2015-09-18 13:57:44
【问题描述】:
我有一个继承层次结构,如下所示:
public class Foo{
public virtual IList<string> Messages{get;set;}
}
public class Foo2: Foo{
public bool DoSomething(){
//Evaluate something;
}
}
public class Bar: Foo2{
public override bool DoSomething(){
var res = base.DoSomething();
if(res)
Messages.Add("Hello World");
return res;
}
}
我的测试对象是Bar,测试框架是最小起订量。
[TestMethod]
public void TestBar()
{
var mockedBar= new Mock<Bar>() {CallBase = true};
mockedBar.SetupGet(x => x.Messages).Returns(new List<string>());
mockedBar.Setup(x => x.DoSomething()).Returns(false);
var result = mockedBar.Object.DoSomething();
Assert.IsFalse(result, "This should fail");
mockedBar.Verify(x => x.DoSomething(), Times.Once, "The base DoSomething is called only once.");
}
我刚刚开始投资于单元测试,但我不确定我是否做得正确。 问题:
现在正在通过,但我对我的测试方法没有信心。
mockedBar.Setup(x=>x.DoSomething())应该设置我的base.DoSomething()呼叫。对吗?我如何测试
Bar.DoSomething()实际上填充了Foo类中的Messages?
非常感谢任何指导。
【问题讨论】:
-
模拟要测试的对象是没有意义的。通常,您只模拟要测试的对象的依赖关系。回答你的第一个问题:不,设置没有设置基本方法,而是设置最终对象的方法,它是 Bar 的模拟。
-
我其实一直在关注这个article。
-
是的,但是那篇文章的作者调用了一种不同于他设置的方法。您正在尝试设置您覆盖且仅调用 base 的方法。
标签: c# unit-testing testing moq