自动测试EF模型构建过程

时间:2013-09-26 15:03:08

标签: c# entity-framework unit-testing automated-tests

我正在对我们的EF模型进行一些复杂的修改(我们使用的是代码优先),我知道它应该特别影响我的数据库和可测试的方式;例如,我应该能够断言;

The db will have an 'Item' table
'Item' will have an integer 'Id' field which is the primary key
'Item' will have a 50-character string 'Name' field

这些单元测试已经成熟,但我找不到测试这类断言的方法。

我想要的是从DbContext获取数据库模型的方法,以便我可以做类似的事情;

var model = BuildModel(MyEntityContext);

var itemTable = model.Db.Tables["Item"]

Assert.IsNotNull(itemTable);
Assert.IsTrue(itemTable.Columns["Id"] != null);
Assert.IsTrue(itemTable.Columns["Name"] != null);
Assert.IsTrue(itemTable.Columns["Name"].Length == 50);
...

有没有人知道如何获取DbContext对象隐含的数据库结构描述?

1 个答案:

答案 0 :(得分:2)

你可以从这样的事情开始......看看这是否会带你到任何地方。

using(ObjectContext context = new ObjectContext())  
{
var queryResult = from meta in context.MetadataWorkspace.GetItems(DataSpace.CSpace)
                  .Where(m => m.BuiltInTypeKind == BuiltInTypeKind.EntityType)
                  from p in (meta as EntityType).Properties
                  .Where(p => p.DeclaringType.Name == context.GetType().Name
                  && p.Name == PropertyName
                  Select new {Length = p.TypeUsage.Facets["MaxLength"].Value, Name=p.TypeUsage.Facets["Name"].Value, p.TypeUsage.Facets["FacetType"].Value 
}

(@ steve-cooper)一个非常有用的开始!谢谢。我已经根据你的建议提出了一个工人阶级 - 我已经把它放在这里,所以我可以给你接受的答案,所以其他人可以看到后续的代码。

    public class ModelSummary
    {
        public Dictionary<string, System.Data.Metadata.Edm.EntityType> Entities { get; private set; }

        public static ModelSummary Load(DbContext context)
        {
              var adapter = (IObjectContextAdapter)context;
              var objectContext = adapter.ObjectContext;

                var summary = new ModelSummary();

              var items = objectContext.MetadataWorkspace.GetItems(DataSpace.SSpace);

              summary.Entities =
                objectContext.MetadataWorkspace.GetItems(DataSpace.SSpace)
                .OfType<EntityType>()
                .ToDictionary(et => et.Name);

            return summary;

        }

        public bool EntityExists(string entityName)
        {
            return this.Entities.ContainsKey(entityName);
        }

        public bool EntityHasProperty(string entityName, string propertyName)
        {
            if (!EntityExists(entityName))
            {
                return false;
            }

            var entity = this.Entities[entityName];

            return entity.Properties.Contains(propertyName);
        }
    }

测试看起来像这样;

    [Test]
    public void Context_SchemaIsExpected()
    {
        var summary = ModelSummary.Load(new MyContext());
        Assert.IsTrue(summary.EntityExists("Item"));
        Assert.IsTrue(summary.EntityHasProperty("Item", "Id"));
    }