Rhino Mocks桩方法无法工作

3
为什么这个测试方法不起作用?我一直收到“需要返回值或要抛出异常”的错误提示。
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 方法是虚拟的吗? - Darin Dimitrov
3个回答

3

您的代码库仍处于“记录”模式。您正在混合使用记录/回放语义(旧的处理方式)和较新的AAA(安排/操作/断言)风格。

不需要创建自己的代码库,只需使用以下命令:

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

现在一切都应该正常工作了。

那个错误已经被修复了,但现在它没有触发 Parse 方法,而是模拟了 GetResponse 方法。我在上面添加了实际的方法。它是否覆盖了 Parse 方法? - Mike Flynn
返回 ParseResponse(response); - Mike Flynn
啊,好的。看起来你想要做的是部分模拟(因为你想要存根类的某些部分但在另一部分运行真正的代码)。我已经有一段时间没有在Rhino.Mocks中做过这个了,但你需要使用PartialMock,确保GetResponse()是虚拟的,并确保GetUrl(username,password)返回一个空字符串(这是你定义的Stub调用的方式)。或者,如果你不关心参数,可以在Stub调用之后使用.IgnoreArguments()。 - PatrickSteele

1
你的最后一行代码在调用 stub 对象上的 Authenticate 方法,但你没有设置返回值或异常来处理它的调用。因此,Rhino Mocks 不知道这个 stub 应该做什么,从而导致错误。你可能不想在 stub 上调用方法 - 这似乎对我来说有点毫无意义,你是否应该在另一个对象(在这个测试中实际上正在测试的对象)上调用方法?


我猜我可能使用不正确。authenticate方法调用外部服务并获取数据。我想用<test>d模仿它并将其发送到authenticate中的Parse方法。 - Mike Flynn

0

那是你的整个测试吗?如果是这样,你的测试没有意义。你测试的唯一对象是你正在存根的对象——测试的主体在哪里?

如果你试图测试SSO类,你绝不能使用mock/stub。如果SSO有一个或多个依赖项,请使用mocking框架来设置这些依赖项与你的SUT之间的预设交互。这正是mocking框架的确切目的。


我想我应该直接测试解析方法,而不是验证方法本身。我的依赖是HTTP请求,我正在尝试删除它。 - Mike Flynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接