代码之家  ›  专栏  ›  技术社区  ›  Wai Yan Hein

无法模拟配置。使用Moq的格式化程序

  •  1
  • Wai Yan Hein  · 技术社区  · 7 年前

    我正在开发一个ASP。NET web API应用程序。我正在对应用程序中的每个组件进行单元测试。我使用Moq单元测试框架来模拟数据。现在我想嘲笑 Configuration.Formatters.JsonFormatter 在我的单元测试中,因为我在单元测试下的操作使用它,如下所示:

    public HttpResponseMessage Register(model)
    {
        return new HttpResponseMessage
                {
                    StatusCode = HttpStatusCode.BadRequest,
                    Content = new ObjectContent<List<string>>(errors, Configuration.Formatters.JsonFormatter)
                };
    }
    

    我想嘲笑 配置格式化程序。JsonFormatter 在单元测试中,如下所示。

    [TestMethod]
    public void Register_ReturnErrorsWithBadRequest_IfValidationFails()
    {
        PostUserRegistration model = new PostUserRegistration {
            Name = "Wai Yan Hein",
            Email = "waiyanhein@gmail.com",
            Password = ""
        };
    
        Mock<JsonMediaTypeFormatter> formatterMock = new Mock<JsonMediaTypeFormatter>();
        Mock<MediaTypeFormatterCollection> formatterCollection = new Mock<MediaTypeFormatterCollection>();
        formatterCollection.Setup(x => x.JsonFormatter).Returns(formatterMock.Object);
        Mock<HttpConfiguration> httpConfigMock = new Mock<HttpConfiguration>();
        httpConfigMock.Setup(x => x.Formatters).Returns(formatterCollection.Object);
        Mock<IAccountRepo> accRepoMock = new Mock<IAccountRepo>();
    
        AccountsController controller = new AccountsController(accRepoMock.Object);
    
        controller.Configuration = httpConfigMock.Object;
        controller.ModelState.AddModelError("", "Faking some model error");
        HttpResponseMessage response = controller.Register(model);
        Assert.AreEqual(response.StatusCode, System.Net.HttpStatusCode.BadRequest);
    }
    

    当我运行单元测试时,它给了我这个错误。 enter image description here

    系统NotSupportedException:非虚拟服务器上的设置无效 (在VB中可重写)成员:x=>x、 JsonFormatter

    那么,我如何修复该错误,以及如何模拟 配置格式化程序。JsonFormatter ?

    1 回复  |  直到 4 年前
        1
  •  1
  •   Nkosi    7 年前

    您不必测试框架是否正在执行其设计目的。相反,与之前在评论中建议的类似,我建议使用 ApiController 并将操作重构为该版本Asp的文档中建议的语法。Net Web API

    public IHttpActionResult Register(PostUserRegistration model) {
        if (!ModelState.IsValid)
            return BadRequest(ModelState); //<-- will extract errors from model state
    
        //...code removed for brevity
    
        return Ok();
    }
    

    上述方法的一个简单单元测试示例如下所示。。。

    [TestMethod]
    public void Register_ReturnErrorsWithBadRequest_IfValidationFails() {            
        //Arrange
        PostUserRegistration model = new PostUserRegistration {
            Name = "Wai Yan Hein",
            Email = "waiyanhein@gmail.com",
            Password = ""
        };
    
        var accRepoMock = new Mock<IAccountRepo>();
        var controller = new AccountsController(accRepoMock.Object);
        controller.ModelState.AddModelError("", "Faking some model error");
    
        //Act
        var response = controller.Register(model) as InvalidModelStateResult; //<-- Note the cast here
    
        //Assert
        Assert.IsNotNull(response);
    }
    

    如果注入的依赖项不会在测试中的方法中被引用/调用,那么您也可以放弃模拟并注入 null . 然而,这取决于原始问题中未提供的代码。