c# - 如何使用 Rhino 模拟设置 stub 和分配网络响应

标签 c# asp.net asp.net-mvc mocking rhino-mocks

我对 Rhino Mocks 和一般的模拟完全陌生。我仍在思考如何编写模拟代码。

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

  [Test Class]     

    IGeneralMethods myGeneralMethods = new services.Models.GeneralMethods();
        MockRepository mockEngine = new MockRepository();
        IGeneralMethods simulatedService = mockEngine.DynamicMock<IGeneralMethods>();

        simulatedService.Stub(x => x.GetWebResponse().GetResponseStream() = myFakeResponse);

现在最后一行(不起作用)我正在尝试创建一个 stub ,这就是我被卡住的地方。我想要 stub 的代码是这样的:

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

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

我可以从哪里开始?

更新

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

        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”。我已将此方法 stub ,因为我还注意到在我的被测类中将填充的模型传递给它,ModeltoXml 方法只返回 null。所以我猜测 Rhino 已经删除了我的 IGeneralMethods 类中的所有方法。

最佳答案

因为 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();

关于c# - 如何使用 Rhino 模拟设置 stub 和分配网络响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188613/

相关文章:

c# - 给定一个作为字符串的 T-SQL 类型,将其评估为 .Net 类型的最简单方法是什么?

c# - 验证摘要和错误的自定义格式

c# - ASP.NET MVC - 查看位置问题 : The view 'Index' or its master was not found

c# - 如何将此示例 foreach 转换为 lambda 表达式?

c# - 为什么我需要使用 Rfc2898DeriveBytes 类(在 .NET 中)而不是直接使用密码作为 key 或 IV?

asp.net - 在URL中传递空字符串参数

asp.net - System.NullReferenceException : Object reference not set to an instance of an object. in vb.net

c# - 从硬编码模型到数据驱动菜单

c# - 如何使用 mvc4 C# 在我的 linq 中将多个表包含到实体急切加载中

c# - 以编程方式禁用 Windows 7 上的虚拟键盘?