MVC 在寫商業邏輯驗證的時候,通常都會寫在Model裡面,這好處除了統一的寫法之外,單元測試也很好寫,今天就來說明如何單元測試 Model 驗證。

首先我們會有一個要被驗證的 Model

Model
  • cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class VM : IValidatableObject
{
[Required]
public string Email { get; set; }

public string Name { get; set; }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.Name == "Test")
{
yield return new ValidationResult("Please, set right name");
}
}
}

使用 Validator 驗證 Model

寫單元測試的話,其實很簡單,只要用 Validator.TryValidateObject 就能夠知道是否驗證成功,以及取得錯誤訊息。
所以寫單元測試就兩個重點要記得,這樣就能輕易寫 Model 驗證的單元測試了:

  • Validator.TryValidateObject 回傳是否驗證成功
  • 傳入 List<ValidationResult> 取得錯誤訊息
Unit Test
  • cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[TestMethod()]
public void ValidateTest()
{
// Arrange
var model = new VM()
{
Email = null
};

// Act
var validationResults = new List<ValidationResult>();
var actual = Validator.TryValidateObject(model, new ValidationContext(model), validationResults, validateAllProperties: true);

// Assert
Assert.IsFalse(actual, "Expected validation to fail.");
Assert.IsTrue(validationResults[0].MemberNames.ElementAt(0) == nameof(model.Email));
}

參考

How to Unit Test .NET Entity Validation