2009-08-17 67 views
2

我正在尝试moq,并且我对Setup()方法有疑问。我有以下的接口和类:关于使用安装程序设置Moq行为的问题

public interface IMyInterface 
{ 
    void Print(string name); 
} 
public class MyClass 
{ 
    private IMyInterface my; 
    public MyClass(IMyInterface my) 
    { 
     this.my = my; 
    } 

    public void Print() 
    { 
     my.Print("hello world"); 
    } 
} 

而且我已经得到了使用NUnit这个单元测试:

[Test] 
public void AnotherTest() 
{ 
    var mock = new Mock<IMyInterface>(); 
    mock.Setup(m => m.Print("hello world")).AtMostOnce(); 

    var myClass = new MyClass(mock.Object); 
    myClass.Print(); 

    mock.Verify(m => m.Print("hello world"), Times.Exactly(1)); 
} 

我已经试过这两个注释/取消注释出以下行,这两项测试分别为成功的。这让我怀疑在这种情况下Setup()是否必要,因为我正在执行Verify()?

我正在使用版本3.5.716.1。

回答

2

在你的第一个例子中,你是对的,你不需要调用设置,因为你正在验证设置只执行一次。

但是在你的第二次单元测试中,它通过了,因为你没有真正验证你的设置。

如果调用mock.VerifyAll(),则测试将失败。

AtMostOnce()设置了它只会执行一次的期望。只有在明确验证设置被调用一次后,测试才会失败。它不会因为你多次呼叫而实际上失败。

+0

是的,我刚刚意识到为什么测试通过关于第二个quetsion。 – Jeff 2009-08-17 02:39:58

+0

在我看来,手动验证所有场景比设置行为更明确,然后执行VerifyAll()。 – Jeff 2009-08-17 02:45:44