0

场景:验证我的班级是否使用提供的 IRestclient 发出 RestRequest,其中在请求中设置了某些参数。

    public class MyClass {
    private readonly IRestClient _client;

    public MyClass(IRestClient client) {
        _client = client;
    }

    void DoIt() {
        var req = new RestRequest { Method = WebMethod.Get, Path = "/DoIt" };
        req.AddParameter("key1", "value1");
        req.AddParameter("key2", "value2");

        var resp = _client.Request(req);
    }

}

[TestFixture]
public class MyClassTests {
    [Test]
    public void VerifyDoIt() {
        var client = MockRepository.GenerateStrictMock<IRestClient>();
        var resp = new RestResponse { StatusCode = HttpStatusCode.OK };
        client.Expect(x => x.Request(null)).IgnoreArguments().WhenCalled(inv => {
            var req = inv.Arguments[0] as RestRequest;
            //NO WAY TO VALIDATE THAT PARAMETERS HAS BEEN SET!
            inv.ReturnValue = resp;
        });
    }
}

Hammock 是否根本无法以这种方式进行测试,还是我错过了一些重要的东西?

编辑:这不是关于如何使用 Rhino.Mocks 访问/验证方法参数的问题,而是关于 Hammock 如何/是否支持测试/验证在单元测试场景中设置的请求参数的问题。

4

1 回答 1

0

如果您需要验证发送到模拟/存根方法的参数,您可以使用 Rhino.Mocks 的 "GetArgumentsForCallsMadeOn" 方法。将一个表示调用的 lambda 传递给它,它将返回一个锯齿状数组。第一个元素 ([0]) 将是第一次调用该方法时传递的参数数组。第二个元素([1])将是第二次调用该方法时传递的参数数组,等等......

你可以像这样重写你的测试来验证请求数据:

var client = MockRepository.GenerateStub<IRestClient>();

var mc = new MyClass(client);
mc.DoIt();

client.AssertWasCalled(c => c.Request(null), o => o.IgnoreArguments());
var req = (RestRequest)client.GetArgumentsForCallsMadeOn(c => c.Request(null), o => o.IgnoreArguments())[0][0];

Assert.AreEqual("/DoIt", req.Path);
Assert.AreEqual(WebMethod.Get, req.Method);
于 2011-11-03T12:07:18.470 回答