C# c中单元测试的必填字段#

C# c中单元测试的必填字段#,c#,unit-testing,C#,Unit Testing,我的项目中有一份申请表,我想写单元测试。 My code behind具有服务器端验证所需的字段,以确保该字段不为空。我需要帮助知道我是否写对了,因为这只是我写单元测试的第二天。请友善一点,我才13岁 [Required(ErrorMessage = "Please provide a title")] public string Title { get; set; } 然后在我的单元测试中,我做到了 public void TitleIsNotBlank() {

我的项目中有一份申请表,我想写单元测试。 My code behind具有服务器端验证所需的字段,以确保该字段不为空。我需要帮助知道我是否写对了,因为这只是我写单元测试的第二天。请友善一点,我才13岁

[Required(ErrorMessage = "Please provide a title")]        
public string Title
{
    get; set;
}
然后在我的单元测试中,我做到了

public void TitleIsNotBlank()
{
    Assert.IsNotNullOrEmpty(_vm.Title);
}

这会检查字段是否为空吗?

重要的是要了解
[必需]
属性仅装饰属性,但除非有什么东西调用其功能,否则它不会自动验证属性

通过装饰该属性,您可以告诉可能检查它的任何其他进程,它应该是必需的,并且错误消息应该读取什么。例如,MVC框架的验证为您触发此属性中的验证。这就是验证实际发生的时间

在我看来,这在理想情况下应该在业务对象级别进行测试(当您实际将模型的值分配给对象并尝试使用它做一些事情时,比如保存它)

假设属性的验证代码已经过测试,所以不需要这样做。但是,由于您的目标是增加覆盖率,您可以做的是通过检查字段并确保其装饰为这样来测试以确保字段按要求“标记”:

var type = typeof(YourModelClass);
var property = type.GetProperty("Title");
var attributes = (Required[])property.GetCustomAttributes(typeof(Required), false);
Assert.IsTrue(attributes.Length > 0); 

的确如此。尽管请记住,单元测试不考虑
[必需(ErrorMessage=“请提供标题”)]
属性,但它只是直接测试字段本身。我还认为不能保证空字符串会在该属性和
IsNotNullOrEmpty
断言之间表现出相同的行为。(尽管它碰巧也有相同的行为。)所以,可能值得明确地测试边缘情况。我只理解其中的一半。您的意思是,它只会测试字段是否为空或null,但不会测试返回的错误消息是否就是该错误消息。如果是,我理解。谢谢你这是正确的理解,是的。您不应该真的需要测试属性的行为,因为这是一个框架组件,通常由供应商测试。这取决于您对框架的不信任程度。100%覆盖率的单元测试是一个值得追求的目标,但在任何复杂系统中,(1)关于“100%”的含义一直存在争议,(2)测试某些组件的回报率不断下降。(这意味着测试某些代码的价值并不总是超过开发测试的成本。有时。)是的,我理解。我正在努力提高覆盖率,所以我希望有这么多必填字段,覆盖率会提高。非常感谢。