2009-04-30 78 views
2

我有一个用户控件,它在我想测试的ValidateChildren方法中做了一些验证。我已经创建了用户控件的部分模拟,但是虽然我没有对ValidateChildren方法设置任何期望,但我只是简单地调用它,它会被略过并且方法内的代码永远不会执行。要尝试理解是怎么回事我创建了一个简单的测试,像这样:即使没有设定预期,为什么我的部分模拟模拟了所有虚拟方法?

public class Foo 
{   
    public virtual bool Method1() 
    { 
     throw new NotImplementedException(); 
    } 

    public virtual bool Method2() 
    { 
     return Method1(); 
    } 
} 

,并用它来测试它:

[Test] 
public void TestFooMethods() 
{ 
    MockRepository m = new MockRepository(); 
    Foo foo = m.PartialMock<Foo>(); 

    RhinoMocksExtensions.Expect<Foo,bool>(
          foo, 
          delegate (Foo obj) 
          { 
           return obj.Method1(); 
          } 
         ).Return(true); 

    Assert.IsTrue (foo.Method2()); 
} 

现在我希望foo.Method1被嘲笑和Foo方法2不是。但是,这总是返回false,如果我尝试在调试器中逐步执行foo.Method2(),我不能介入它。

任何想法为什么?

回答

0

好了,以后多一些玩耍(也许只是写问题下来帮我想更清楚的了解它)我想我已经找到了解决方案。

看来我需要调用:

RhinoMocksExtensions.Replay (foo); 

我打电话

Assert.IsTrue (foo.Method2()); 

之前也许犀牛制品的需求,在同时使用虚拟方法,而不是设置期望被明确告知。不知道为什么。如果有人知道背后的原因,我很想知道。

无论如何,一切似乎都在工作,那么快乐的日子。

5

如果你模拟一个对象,它将覆盖所有的抽象/虚拟方法,而不管模拟类型如何。你虽然可以做的就是让你的方法的期望,并告诉它通过执行它覆盖原来的方法:你没有使用犀牛

CallOriginalMethod(OriginalCallOptions.CreateExpectation); 

嘲笑它是设计的方式,其也可能会导致你麻烦。我已经重新写你的测试中,应该使用C#3.0和Lambda和扩展方法来编写方式:

[TestMethod] 
public void TestFooMethods() 
{ 
    //Generate a new Mock to test against 
    Foo foo = MockRepository.GenerateMock<Foo>(); 

    //Expect a call to Method1 on object foo and return true 
    foo.Expect(f => f.Method1()).Return(true); 
    //Expect a call to Method2 on object foo and call the original method 
    foo.Expect(f => f.Method2()).CallOriginalMethod(OriginalCallOptions.CreateExpectation); 

    Assert.IsTrue(foo.Method2()); 

    //Verify all our expectations on foo 
    foo.VerifyAllExpectations(); 
} 
+0

这似乎不工作,因为我会想到。我遇到问题: Rhino.Mocks.Exceptions.ExpectationViolationException:Foo.Method1();预期#1,实际#0。我打电话给RhinoMocksExtensions.VerifyAllExpectations(foo); ,我仍然需要调用RhinoMocksExtensions.Replay(foo);在我验证期望之前。我有点困惑,为什么虽然,如果我通过代码Method2被调用,我可以介入并看到它调用Method1(),所以它为什么声称它不叫我不知道。 – 2009-04-30 09:53:16