2012-02-03 159 views
57

我对C#中的单元测试以及学习使用Moq相当陌生。以下是我正在测试的课程。使用Moq验证方法调用

class MyClass 
{ 
    SomeClass someClass; 
    public MyClass(SomeClass someClass) 
    { 
     this.someClass = someClass;  
    } 

    public void MyMethod(string method) 
    { 
     method = "test" 
     someClass.DoSomething(method); 
    } 
} 

class Someclass 
{ 
    public DoSomething(string method) 
    { 
     // do something... 
    } 
} 

下面是我的TestClass:

class MyClassTest 
{ 
    [TestMethod()] 
    public void MyMethodTest() 
    { 
     string action="test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 
     mockSomeClass.SetUp(a => a.DoSomething(action)); 
     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 
     mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>())); 
    } 
} 

我得到以下异常:

Expected invocation on the mock at least once, but was never performed 
No setups configured. 
No invocations performed.. 

我只是想验证该方法 “的MyMethod” 是被称为与否。我错过了什么吗?

在此先感谢!

+1

如果'SomeClass'没有'MyMethod(string)'的定义,那看起来好像没有。 – 2012-02-03 23:08:26

+0

对不起..我编辑了我的问题.. – user591410 2012-02-03 23:17:27

+1

你在正确的轨道上,但在发布的代码中有错误。它不会编译 - 在Someclass上封装,在DoSomething上无效返回。之后,您需要公共访问权限,然后使DoSomething虚拟。简而言之,您的生产代码中可能也存在一个错误。 – TrueWill 2012-02-04 01:37:26

回答

81

您正在检查错误的方法。 Moq要求你设置(然后选择验证)依赖类中的方法。

你应该更喜欢这样做的事情:

class MyClassTest 
{ 
    [TestMethod] 
    public void MyMethodTest() 
    { 
     string action = "test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 

     mockSomeClass.Setup(mock => mock.DoSomething()); 

     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 

     // Explicitly verify each expectation... 
     mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once()); 

     // ...or verify everything. 
     // mockSomeClass.VerifyAll(); 
    } 
} 

换句话说,你是验证调用MyClass#MyMethod,类肯定会在这个过程中调用SomeClass#DoSomething一次。请注意,您不需要参数Times;我只是在展示它的价值。

+0

对不起,我用正确的方法编辑了我的问题。正如你所提到的,我先尝试了SetUp,然后进行了验证。它仍然给我同样的例外。 – user591410 2012-02-03 23:23:30

+0

我用你提出的建议更新了我的问题,但即使这也给了我同样的例外..请指教。 – user591410 2012-02-03 23:31:42

+0

明白了..谢谢..我在设置时错误地设置了方法的参数。 – user591410 2012-02-04 17:43:09