如何使用Rhino mocking设置存根并分配网络响应

本文关键字:分配 网络 响应 存根 设置 何使用 Rhino mocking | 更新日期: 2023-09-27 18:00:47

我对Rhino Mocks和一般的mocking完全陌生。我仍然在思考如何对mock进行编码。

我有一个测试类,其中包含类似的内容:

  [Test Class]     
    IGeneralMethods myGeneralMethods = new services.Models.GeneralMethods();
        MockRepository mockEngine = new MockRepository();
        IGeneralMethods simulatedService = mockEngine.DynamicMock<IGeneralMethods>();
        simulatedService.Stub(x => x.GetWebResponse().GetResponseStream() = myFakeResponse);

现在,最后一行(不起作用)我正在尝试创建一个存根,而这正是我陷入困境的地方。我想截取的代码是:

public WebResponse GetWebResponse(WebRequest request)
    {
        try
        {
            WebResponse getResponse = request.GetResponse(); 
            return getResponse;
        }
        catch
        {
            //other actions
        }
        return null;
    }

我有另一种方法可以创建WebResponse,所以我想做的是阻止GetWebResponse方法实际尝试发出请求,只返回我的假/预制web响应。

我从哪里开始?

更新

我一直在调整代码,并取得了一些进展。这是我的最新代码(正在进行中):

        MockRepository mockEngine = new MockRepository();
        byte[] responseData = Encoding.UTF8.GetBytes("my XML here");
        Stream stream = new MemoryStream(responseData);
        WebRequest request = (WebRequest)mockEngine.StrictMock(typeof(WebRequest));
        WebResponse response = (WebResponse)mockEngine.StrictMock(typeof(WebResponse));
        Expect.On(request).Call(request.GetResponse()).Return(response);
        Expect.On(response).Call(response.GetResponseStream()).Return(stream);
        
       
        var stubbedGetWebResponse = mockEngine.Stub<IGeneralMethods>();
        stubbedGetWebResponse.Stub(x => x.ModeltoXml(newTicket)).Return("test");
        stubbedGetWebResponse.Stub(x => x.GetWebResponse(request)).Return(response);

        var test = new MyApi().NewIn(newTicket, referrer, stubbedGetWebResponse);
        stubbedGetWebResponse.VerifyAllExpectations();

我确信我在这里没有领会到什么,因为当我调试测试时,我的ModeltoXml方法没有返回字符串"test"。我已经禁用了这个方法,因为我还注意到,在将填充的模型传递给它的被测试类中,ModeltoXml方法只返回null。所以我猜Rhino已经剔除了我的IGeneralMethods类中的所有方法。

如何使用Rhino mocking设置存根并分配网络响应

由于WebRequest是一个抽象类,请尝试使用PartialMockPartialMock将允许您覆盖这些虚拟方法。

// Arrange
var mockResp = MockRepository.GeneratePartialMock<WebResponse>();
var responseData = Encoding.UTF8.GetBytes("my XML here");
var stream = new MemoryStream(responseData);
mockResp.Expect(x => x.GetResponseStream()).Return(stream);
var mockReq = MockRepository.GeneratePartialMock<WebRequest>();
mockReq.Expect(x => x.GetResponse()).Return(mockResp);
// Act
// test here!
// Assert
mockReq.VerifyAllExpectations();
mockResp.VerifyAllExpectations();