相关疑难解决方法(0)

MVC验证的单元测试

当我在MVC 2预览1中使用DataAnnotation验证时,如何在验证实体时测试我的控制器操作是否在ModelState中放置了正确的错误?

一些代码来说明.一,行动:

    [HttpPost]
    public ActionResult Index(BlogPost b)
    {
        if(ModelState.IsValid)
        {
            _blogService.Insert(b);
            return(View("Success", b));
        }
        return View(b);
    }
Run Code Online (Sandbox Code Playgroud)

这是一个失败的单元测试,我认为应该通过但不是(使用MbUnit和Moq):

[Test]
public void When_processing_invalid_post_HomeControllerModelState_should_have_at_least_one_error()
{
    // arrange
    var mockRepository = new Mock<IBlogPostSVC>();
    var homeController = new HomeController(mockRepository.Object);

    // act
    var p = new BlogPost { Title = "test" };            // date and content should be required
    homeController.Index(p);

    // assert
    Assert.IsTrue(!homeController.ModelState.IsValid);
}
Run Code Online (Sandbox Code Playgroud)

我想除了这个问题,应该我来测试验证,并应在我这种方式测试它?

validation tdd asp.net-mvc unit-testing asp.net-mvc-2

75
推荐指数
4
解决办法
2万
查看次数

ASP.NET MVC Controller post方法单元测试:ModelState.IsValid始终为true

我已经为ASP.NET MVC Web应用程序编写了我的第一个单元测试.一切正常,它给了我有价值的信息,但我不能在视图模型中测试错误.ModelState.IsValid始终为true,即使未填充某些值(空字符串或null).

我已经读过,当发布的数据映射到模型时,模型验证会发生,您需要编写一些代码来自行进行模型验证:

我已经尝试了链接网页中提供的三个示例,但它似乎对我不起作用.

一些代码:

我的观点模型

...
[Required(ErrorMessageResourceName = "ErrorFirstName", ErrorMessageResourceType = typeof(Mui))]
[MaxLength(50)]
[Display(Name = "Firstname", ResourceType = typeof(Mui))]
public string FirstName { get; set; }
...
Run Code Online (Sandbox Code Playgroud)

控制器

...
 [HttpPost]
    public ActionResult Index(POSViewModel model)
    {
        Contract contract = contractService.GetContract(model.ContractGuid.Value);

        if (!contract.IsDirectDebit.ToSafe())
        {
            ModelState.Remove("BankName");
            ModelState.Remove("BankAddress");
            ModelState.Remove("BankZip");
            ModelState.Remove("BankCity");
            ModelState.Remove("AccountNr");
        }

        if (ModelState.IsValid)
        {
            ...

            contractValidationService.Create(contractValidation);
            unitOfWork.SaveChanges();

            return RedirectToAction("index","thanks");
        }
        else
        {
            return Index(model.ContractGuid.ToString());
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的单元测试

  posViewModel.FirstName = null;
  posViewModel.LastName = "";
 ...
 var modelBinder = new ModelBindingContext() …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc unit-testing modelstate

34
推荐指数
2
解决办法
3万
查看次数

在Asp.Net MVC Web Api中测试Controller时,ModelState.IsValid始终为true

我试图完成这项工作并进行了许多google/stackoverflow搜索而根本没有运气.

我有一个简单的模型:

public class MovieModel
{
    public string Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器中的方法:

// POST: api/Movies
public IHttpActionResult Post([FromBody]MovieModel movieModel)
{
    if (ModelState.IsValid)
    {
        //Code
    }
}
Run Code Online (Sandbox Code Playgroud)

一个测试方法(是一个集成测试,但在单元测试中会发生同样的情况):

[TestMethod]
public void MoviesController_Post_Without_Name()
{
    // Arrange
    var model = new MovieModel();
    model.Name = "";

    // Act
    var result = controller.Post(model);

    // Assert
    Assert.IsInstanceOfType(result, typeof(InvalidModelStateResult));
    Assert.AreEqual(6, controller.Get().Count());
}
Run Code Online (Sandbox Code Playgroud)

尽管模型显然无效,但它总是将IsValid属性评估为true.

到目前为止,我尝试了许多方法但没有成

c# testing modelstate asp.net-web-api

12
推荐指数
2
解决办法
4141
查看次数

无论必需字段中的空值如何,ModelState始终被视为有效

我一直在 环顾 四周,我认为我的解决方案很好,但不知何故ModelState.IsValid财产总是如此true.

请考虑以下代码段:

[Route("address")]
[HttpPut]
[ResponseType(typeof(UserViewModel))]
public IHttpActionResult UpdateAddress([FromBody] UpdateAdressValidationModel model)
{
   if (!ModelState.IsValid)
   {
       return BadRequest(ModelState);
   }
   // irrelevant code omitted
}

[TestMethod]
public void UpdateAddress_WithoutStreet_ReturnsHttpCode400()
{
    var userController = new UserController(new UserRepository(_context));
    var addressInfo = new UpdateAdressValidationModel
    {
        City = "Ghent",
    };

    var response = userController.UpdateAddress(addressInfo) as BadRequestResult;

    Assert.IsNotNull(response);
}

public class UpdateAdressValidationModel
{
    [Required]
    public string Street { get; set; }

    [Required]
    public int? Number { get; set; }

    [Required]
    public …
Run Code Online (Sandbox Code Playgroud)

c# asp.net modelstate asp.net-web-api asp.net-web-api2

9
推荐指数
1
解决办法
3101
查看次数