【问题标题】:Rhino Mocks Stub Method not working犀牛模拟存根方法不起作用
【发布时间】:2011-09-22 05:59:04
【问题描述】:

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

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");
        }

【问题讨论】:

  • GetResponse 方法是虚拟的吗?

标签: c# unit-testing rhino-mocks stub


【解决方案1】:

这是你的全部测试吗?如果是这样,那么您的测试毫无意义。您的测试中唯一的对象是您要存根的对象——测试的主题在哪里?

如果您尝试测试 SSO 类,您绝对不会想要模拟/存根它。如果 SSO 具有一个或多个依赖项,请使用模拟框架在这些依赖项和您的 SUT 之间设置固定交互。这就是模拟框架的确切目的。

【讨论】:

  • 我想我应该直接测试 parse 方法而不是 authenticate 方法本身。我的依赖是我试图删除的 HTTP 请求。
【解决方案2】:

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

无需创建自己的存储库,只需使用:

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

现在一切正常。

【讨论】:

  • 修复了该错误,但现在它没有命中 Parse 方法,而是模拟 GetResponse 方法。我在上面添加了实际方法。它是否覆盖 Parse 方法?
  • return ParseResponse(response);
  • 啊,好的。所以看起来你想要做的是部分模拟(因为你想存根类的某些部分但在另一部分运行真实代码)。自从我在 Rhino.Mocks 中执行此操作已经有一段时间了,但是您需要使用 PartialMock,确保 GetResponse() 是虚拟的,并确保 GetUrl(username, password) 返回一个空字符串(这是您定义存根的方式称呼)。或者,如果您不关心 args,请在 Stub 调用之后使用 .IgnoreArguments()。
【解决方案3】:

您的最后一行是在您的存根对象上调用Authenticate 方法,您没有设置在调用它时要抛出的返回值或值或异常,因此 Rhino Mocks 不知道存根应该做什么并且它导致错误。您可能不想在存根上调用方法 - 这对我来说似乎毫无意义,是否有另一个对象(您实际上正在此测试中测试)您应该调用方法?

【讨论】:

  • 我想我用错了。 authenticate 方法调用外部服务并取回数据。我想用 d 模仿它并将其发送到同样在验证中的 Parse 方法。
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 2011-11-08
  • 1970-01-01
  • 2011-02-15
  • 2010-11-07
  • 1970-01-01
  • 2010-10-29
  • 2016-06-06
相关资源
最近更新 更多