2011-06-24 45 views
3

为什么这种测试方法不起作用?我不断收到需要返回值或抛出的异常。Rhino Mocks存根方法不起作用

public AuthenticateResponse Authenticate(string username, string password) 
     { 
      string response = GetResponse(GetUrl(username, password).ToString()); 

      return ParseResponse(response); 
     } 


     [TestMethod()] 
     [ExpectedException(typeof(XmlException))] 
     public void Authenticate_BadXml_ReturnException() 
     { 
      MockRepository mockRepository = new MockRepository(); 
      SSO sso = mockRepository.Stub<SSO>(); 

      sso.Stub(t => t.GetResponse("")).Return("<test>d"); 

      AuthenticateResponse response = sso.Authenticate("test", "test"); 
     } 
+0

GetResponse方法是虚拟的吗? –

+0

是的,它是虚拟的 –

回答

3

您的存储库仍处于“记录”模式。您将记录/重放语义(“旧”的做事方式)与新的AAA(排列/行为/断言)风格混合在一起。

而是创建自己的资源库,只需使用:

var sso = MockRepository.GeneateStub<SSO>(); 

一切都应该可以正常工作了。

+0

修复了这个错误,但现在它不是触及Parse方法,而是模拟GetResponse方法。我添加了上面的实际方法。它重写Parse方法吗? –

+0

我的代码中没有看到任何“Parse”方法。 – PatrickSteele

+0

return ParseResponse(response); –

1

你的最后一行是调用存根对象上Authenticate方法,您没有设置退货或值或异常调用它时抛出,所以犀牛嘲笑不知道存根应该做什么并导致错误。你可能不想在你的存根上调用一个方法 - 这对我来说似乎毫无意义,是否有另一个对象(你在这个测试中实际测试过)应该调用一个方法?

+0

我想我错了。身份验证方法会调用外部服务并获取数据。我想用 d来模仿它,并将它发送给也在验证中的Parse方法。 –

0

这是你的全部测试吗?如果是这样,你的测试是没有意义的。测试中唯一的对象是你正在测试的对象 - 测试的主题在哪里?

如果您尝试测试SSO类,那么您的绝对不会是想要模拟/存根。如果SSO具有一个或多个依赖关系,则使用模拟框架来设置这些依赖关系与SUT之间的固定交互。这是模拟框架的确切目的。

+0

我想我应该直接测试解析方法,而不是验证方法本身。我的依赖是我试图删除的HTTP请求。 –