为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 shims 和/或 Moq 模拟服务器传输方法

如何使用 shims 和/或 Moq 模拟服务器传输方法

C#
小唯快跑啊 2022-07-23 09:43:55
我正在尝试模拟以下传输请求。我尝试过使用 Moq,但它不喜欢它是一个方法调用的事实。有任何想法吗?我试过使用垫片,但对我来说并不完全有意义。https://social.msdn.microsoft.com/Forums/vstudio/en-US/4e423407-300d-46ba-bfc9-30465fb18f07/how-to-fake-httpcontextcurrent-using-shim?forum=vstest 我尝试模拟http上下文这种方式,但它也没有奏效。 https://justinchmura.com/2014/06/26/mock-httpcontext/public class MyModule1 : IHttpModule{    /// <summary>    /// You will need to configure this module in the Web.config file of your    /// web and register it with IIS before being able to use it. For more information    /// see the following link: https://go.microsoft.com/?linkid=8101007    /// </summary>    #region IHttpModule Members    public void Dispose()    {        //clean-up code here.    }    public void Init(HttpApplication context)    {        // Below is an example of how you can handle LogRequest event and provide         // custom logging implementation for it        context.LogRequest += new EventHandler(OnLogRequest);        context.BeginRequest += new EventHandler(OnBeginRequest);    }    private void OnBeginRequest(object sender, EventArgs e)    {        onbegin(new HttpContextWrapper(((HttpApplication)sender).Context));    }    private void onbegin(HttpContextBase context)    {        // other header stuff goes here        context.Server.TransferRequest("bobsyouruncle", true);    }    #endregion    public void OnLogRequest(Object source, EventArgs e)    {        //custom logging logic can go here    }
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

类似于我在此处提供的答案中采用的方法


如何在 IHttpModules 中测试 HttpApplication 事件


您可以创建一个工厂方法/函数,将当前紧密耦合的实现问题包装在抽象中,从而实现更好的模拟和可测试性


重构模块


public class MyModule1 : IHttpModule {

    public void Dispose() {

        //clean-up code here.

    }


    public void Init(HttpApplication application) {

        // Below is an example of how you can handle LogRequest event and provide 

        // custom logging implementation for it

        application.LogRequest += new EventHandler(OnLogRequest);

        application.BeginRequest += new EventHandler(OnBeginRequest);

    }


    public Func<object, HttpContextBase> GetContext = (object sender) => {

        return new HttpContextWrapper(((HttpApplication)sender).Context);

    };


    public void OnBeginRequest(object sender, EventArgs e) {

        var context = GetContext(sender);

        onbegin(context);

    }


    private void onbegin(HttpContextBase context) {

        // other header stuff goes here

        context.Server.TransferRequest("bobsyouruncle", true);

    }


    public void OnLogRequest(Object source, EventArgs e) {

        //custom logging logic can go here

    }


    //...

}

测试GetContext时可以替换工厂函数以使用模拟。


例如


[TestMethod]

public void Server_Should_Transfer() {

    //Arrange

    var server = new Mock<HttpServerUtilityBase>();

    var context = new Mock.<HttpContextBase>();

    context.Setup(_ => _.Server).Returns(server.Object);


    var sut = new MyModule1();


    //replace with mock context for test

    sut.GetContext = (object sender) => context.Object;


    //Act

    sut.OnBeginRequest(new object(), EventArgs.Empty);


    //Assert

    server.Verify(_ => _.TransferRequest("bobsyouruncle", true), Times.AtLeastOnce);

}


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信