为 System.Web.HttpApplication 编写自动化测试

软件测试 自动化测试 C# 点网
2022-01-17 13:08:16

我目前正在使用 MoqSystem.Web.HttpApplication在 C# 中编写自动化测试:

public FakeHttpApplication CreateBaseMocks()
{
    MockContext = new Mock<HttpContextBase>();
    MockRequest = new Mock<HttpRequestBase>();
    MockResponse = new Mock<HttpResponseBase>();
    MockSession = new Mock<HttpSessionStateBase>();
    MockServer = new Mock<HttpServerUtilityBase>();

    MockContext.Setup(ctx => ctx.Request).Returns(MockRequest.Object);
    MockContext.Setup(ctx => ctx.Response).Returns(MockResponse.Object);
    MockContext.Setup(ctx => ctx.Session).Returns(MockSession.Object);
    MockContext.Setup(ctx => ctx.Server).Returns(MockServer.Object);

    HttpContextBase = MockContext.Object;
    HttpRequestBase = MockRequest.Object;
    HttpResponseBase = MockResponse.Object;

    MockRequest.Setup(r => r.Headers).Returns(new NameValueCollection());
    return this;
}

public FakeHttpApplication SetupNormalRequestValues()
{
    //Context.User
    MockUser = new Mock<IPrincipal>();
    MockIdentity = new Mock<IIdentity>();
    MockContext.Setup(context => context.User).Returns(MockUser.Object);
    MockUser.Setup(context => context.Identity).Returns(MockIdentity.Object);

    //Request
    MockRequest.Setup(request => request.InputStream).Returns(new MemoryStream());

    //Response
    MockResponse.Setup(response => response.OutputStream).Returns(new MemoryStream());
    return this;
}

但是,考虑到大多数内部对象和属性仍然存在,以这种方式设置对象还有很多不足之处null有谁知道更好的方法来做到这一点?我正在寻找一种方法来实例化一个更逼真的HttpApplication对象并且不介意有点复杂。

2个回答

我正在尝试使用返回值的对象列表作为队列的模拟。每次我的模拟应该返回一些东西时,它首先在队列中查看我是否已经排队,如果是,则返回它。

然后我为我的模拟实现了一个额外的 Queue 方法,我可以在测试设置期间调用它,它只是按照我希望它们返回的顺序将项目添加到列表中。

在这种情况下,我所有的返回值都将是 ActionResults(我们使用的是 MVC),所以我不需要担心返回类型,但是您可以使用反射来实现类似的东西,您可以返回队列中的第一项IsAssignableTo 方法的返回类型(我认为这是您想要的 Reflection 中的方法......不确定)。

您还可以查看其他内置了这种“记录和播放”功能的模拟库。Moq 更倾向于能够查看是否调用了正确的 API 等,然后是检查模拟接口返回的内容。 本文离题讨论有关使用模拟进行测试的哲学,以解释这种差异。

我可能会使用 selenium 来驱动 ASP.NET 浏览器中的 UI 测试。UI 测试会更加脆弱,但如果您的应用程序正常工作,它们会为您提供准确的指示。

您会发现模拟您显示的项目仍然需要您通过 UI 测试它们是否正常运行。因此,您不妨将测试推向集成 UI 测试,并通过浏览器驱动它们。