4

我正在尝试为实体框架对象的验证创建一个单元测试。我找到了这个链接: 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。谢谢你的帮助。

4

3 回答 3

3

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

/// <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);

}

希望这可以帮助。

于 2013-09-14T06:57:07.813 回答
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 方法不起作用。

于 2013-09-16T09:09:14.267 回答
2

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

在 EF 6 中,您会调用

var actual = Validator.TryValidateObject(myEntityObject, context, results, validateAllProperties: true);
于 2016-01-16T18:38:19.493 回答