【问题标题】:Unit testing for entity Framework validation实体框架验证的单元测试
【发布时间】:2023-03-22 14:30:01
【问题描述】:

我正在尝试为实体框架对象的验证创建一个单元测试。我找到了这个链接: https://stackoverflow.com/a/11514648/2486661 但对我的验证永远不会得到错误的值。我在实体对象的属性中使用数据注释。为此,我创建了一个 MetaData 对象以包含注释并像这样注释实体对象:

[MetadataType(typeof(MyEntityObjectMetaData))]
public partial class MyEntityObject
{
}

我的验证注解是这样的:

public class MyEntityObjectMetaData
{
    [StringLength(8, ErrorMessage = "Invalid Length for myProperty.")]
    public String myProperty { get; set; } 
}

以及单元测试的代码:

    [TestMethod]
    public void TestMethod1()
    {
        MyEntityObject myEntityObject = new MyEntityObject();

        myEntityObject.myProperty = "1234567890";

        var context = new ValidationContext(myEntityObject, null, null);
        var results = new List<ValidationResult>();

        var actual = Validator.TryValidateObject(myEntityObject, context, results);
        var expected = false;

        Assert.AreEqual(expected, actual);
    }

如果我有一个无效的属性值,我不明白为什么对象的验证会返回值 true。感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc entity-framework unit-testing validation


    【解决方案1】:

    这是我对每个视图模型运行的一系列测试的一部分的代码示例,包括确保预期属性名称存在的测试。

    /// <summary>
    /// Check expected properties exist.
    /// </summary>
    [Test]
    public void Check_Expected_Properties_Exist()
    {
    
    // Get properties.
    PropertyInfo propInfoFirstName = typeof(ViewModels.MyModel).GetProperty("FirstName");
    PropertyInfo propInfoLastName = typeof(ViewModels.MyModel).GetProperty("LastName");
    
    // Assert.
    Assert.IsNotNull(propInfoFirstName);
    Assert.IsNotNull(propInfoLastName);
    
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我使用 DBContext 对象解决了这个问题,如下所示:

       MyEntityObject myEntityObject = new MyEntityObject();
       myEntityObject.myProperty = "1234567890";
      
      var dbContext = new DbContext(MyEntityObject, true);
      
      int errors = dbContext.GetValidationErrors().Count();
      
      IEnumerable<DbEntityValidationResult> validationResults = 
                                               dbContext.GetValidationErrors();
      DbValidationError validationError = validationResults.First().ValidationErrors.First();
      
      Assert.AreEqual(1, errors);
      Assert.AreEqual("myProperty", validationError.PropertyName);
      

      MyEntityObject 是 ObjectContext 类的子类,由实体框架自动生成。 我仍然不明白为什么使用 Validator.TryValidateObject 方法不起作用。

      【讨论】:

        【解决方案3】:

        您必须告诉验证器验证所有属性。 dbcontext 将跟踪实体的更改并将特定属性传递给验证器。

        在 EF 6 中你会调用

        var actual = Validator.TryValidateObject(myEntityObject, context, results, validateAllProperties: true);
        

        【讨论】:

          猜你喜欢
          • 2011-05-28
          • 2023-04-09
          • 2013-10-17
          • 1970-01-01
          • 1970-01-01
          • 2017-07-03
          • 2014-08-10
          • 1970-01-01
          • 2010-09-16
          相关资源
          最近更新 更多