spl*_*usq 5 c# unit-testing moq
我想在最后几个小时弄清楚这个Moq体操.我有以下几个类 - 我正在尝试做一个简单的验证而且它失败了 - 我似乎无法弄清楚为什么.
注意在Moq设置期间,我在请求BeginCounter时返回Mock.Of - 但是当我尝试验证它时它失败了.但是,如果我取消注释行.Setup(e => e.BeginCounter.Increment()),则验证有效.
我错过了什么?
public interface IPerformanceCounters
{
void Increment();
void Decrement();
}
public interface IContext
{
IPerformanceCounters BeginCounter { get; }
}
public class Test
{
private readonly IContext context;
public Test(IContext context) { this.context = context; }
public void React() { this.context.BeginCounter.Increment(); }
}
void Test()
{
// ARRANGE
var p = new Mock<IContext>();
p.Setup(e => e.BeginCounter).Returns(() => Mock.Of<IPerformanceCounters>()); // This does not work
// p.Setup(e => e.BeginCounter.Increment()); // However, this works!
// ACT
var test = new Test(p.Object);
test.React();
// ASSERT
p.Verify(v => v.BeginCounter.Increment(), Times.Once());
}
Run Code Online (Sandbox Code Playgroud)
我认为这是因为非设置方法是不可验证的。
据我所知,您正在返回一个模拟,然后尝试对其进行验证。但是,在您取消注释设置之前,它尚未准备好。
void Test()
{
// ARRANGE
var p = new Mock<IContext>();
var perfCountMock = new Mock<IPerformanceCounters>();
p.Setup(e => e.BeginCounter).Returns(() => perfCountMock.Object); // This does not work
perfCountMock.Setup(e => e.Increment());
// ACT
var test = new Test(p.Object);
test.React();
// ASSERT
perfCountMock.Verify(v => v.Increment(), Times.Once());
}
Run Code Online (Sandbox Code Playgroud)
以上是你真正在做的事情。您不是在验证IContext呼叫,而是在验证IPerformanceCounters呼叫。我会这样设置,以便更容易理解,但您也可以轻松取消注释该行
如果您想保持原样,则需要更好地了解其Mock.Of功能。
void Test()
{
// ARRANGE
var p = new Mock<IContext>();
var mockOfPerf = Mock.Of<IPerformanceCounters>();
p.Setup(e => e.BeginCounter).Returns(mockOfPerf); // This does not work
// ACT
var test = new Test1(p.Object);
test.React();
// ASSERT
Mock.Get(mockOfPerf).Verify(v=>v.Increment(), Times.Once());
}
Run Code Online (Sandbox Code Playgroud)
这与上面的内容相同,只是使用了Mock.Of. 您无法验证嵌套的模拟,您需要根据实际的模拟进行验证