【问题标题】:Create mocks with auto-filled properties with Moq?使用 Moq 创建具有自动填充属性的模拟?
【发布时间】:2014-07-25 00:59:26
【问题描述】:

我有一个我想模拟的对象(如 HttpContext 或其他对象)。有时,在某些单元测试中,我不得不模拟大量依赖项,并适当地设置它们的依赖项和值。

下面有一些示例代码来模拟 httpcontext 和另一个类:

    public static HttpContextBase FakeHttpContext()
    {
        var context = new Mock<HttpContextBase>();
        var files = new Mock<HttpFileCollectionBase>();
        var request = new Mock<HttpRequestBase>();
        var response = new Mock<HttpResponseBase>();
        var session = new Mock<HttpSessionStateBase>();
        var server = new Mock<HttpServerUtilityBase>();
        var user = new Mock<IPrincipal>();
        var identity = new Mock<IIdentity>();
        request.Setup(req => req.ApplicationPath).Returns("~/");
        request.Setup(req => req.AppRelativeCurrentExecutionFilePath).Returns("~/");
        request.Setup(req => req.PathInfo).Returns(string.Empty);
        request.Setup(req => req.Form).Returns(new NameValueCollection());
        request.Setup(req => req.QueryString).Returns(new NameValueCollection());
        request.Setup(req => req.Files).Returns(files.Object);
        response.Setup(res => res.ApplyAppPathModifier(MoqIt.IsAny<string>())).
            Returns((string virtualPath) => virtualPath);
        user.Setup(usr => usr.Identity).Returns(identity.Object);
        identity.SetupGet(ident => ident.IsAuthenticated).Returns(true);

        context.Setup(ctx => ctx.Request).Returns(request.Object);
        context.Setup(ctx => ctx.Response).Returns(response.Object);
        context.Setup(ctx => ctx.Session).Returns(session.Object);
        context.Setup(ctx => ctx.Server).Returns(server.Object);
        context.Setup(ctx => ctx.User).Returns(user.Object);

        return context.Object;

}

        registrationView = new Mock<IRegistrationView>();
        registrationView.SetupGet(v => v.Address).Returns("Calle test");
        registrationView.SetupGet(v => v.EmailAddress).Returns("test@test.com");
        registrationView.SetupGet(v => v.Password).Returns("testpass");
        registrationView.SetupGet(v => v.FirstName).Returns("Name");
        registrationView.SetupGet(v => v.LastName).Returns("Surname");
        registrationView.SetupGet(v => v.DaytimePhoneNumber).Returns("666666666");
        registrationView.SetupGet(v => v.WholeSalers).Returns(new List<UserWholesaler>() { 
            new UserWholesaler(true) { CollaborationCode = "1234", Region = "TestReg", WholesalerCode = "10", WholesalerName = "TestWS", RegionName = "RegTest" } });

我想知道:是否有任何库,只需像“registrationView = new MockWithFilledProperties();”这样的调用,就可以让我创建一个具有填充默认值的属性的 Mock?如果有,是哪一个?

谢谢你和亲切的问候。

【问题讨论】:

    标签: c# unit-testing mocking moq


    【解决方案1】:

    Moq 允许您使用

    存根所有属性
    registrationView.SetupAllProperties();
    

    这将使所有属性都跟踪它们的值(即,您可以将一些值写入属性并稍后检索它)并将所有属性设置为其默认值。

    注意:您可以使用链式模拟创建(也称为规范查询)来更快地设置模拟

    IRegistrationView view = Mock.Of<IRegistrationView>(ctx =>
        ctx.Address == "Calle test" &&
        ctx.EmailAddress == "test@test.com" &&
        ctx.Password == "testpass" &&
        ctx.FirstName == "Name" &&
        ctx.LastName == "Surname");
    

    【讨论】:

    • 这就是我需要知道的:)。谢谢@Sergey
    • 对于http上下文,有一堆只读字段。 mock 可以向其中注入一些东西吗?
    • 有没有办法设置非默认值的属性?例如带有随机字符串的地址
    【解决方案2】:

    现在你可以这样做了:

    Mock.Of<IMyclass>()
    

    这将为您提供一个要传递的默认对象,如果您真的不需要该对象并且它的函数的默认答案是可以的,这将起到作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2012-08-21
      • 2018-06-28
      • 1970-01-01
      • 2012-04-29
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多