模拟EF上下文时的关系检查

时间:2014-10-07 18:46:57

标签: c# entity-framework moq

我想知道在使用Moq在EF上进行单元测试存储库时是否有任何方法可以模拟外键检查?我有以下代码,这些代码在技术上应该失败,因为其中一个关系在数据库或上下文中的模拟集中都不存在。

var entitySet = new Mock<DbSet<MyEntity>>();
var mockContext = new Mock<MyContext>();
mockContext.Setup(x => x.Set<MyEntity>()).Returns(entitySet.Object);
var myentity = new MyEntity
{
    RefID = "ABCD", //Foreign Key that does not exist in the context
};

var repo = new MyRepo<MyEntity>(mockContext.Object);
repo.Add(myentity);         

//repo.Add()
public void Add(TEntity entity)
{
    DbSet.Add(entity);
    context.SaveChanges();
}

我希望这段代码失败,因为带有引用ID的对象不存在但是成功并且任何验证我添加到mockContext的成功也是成功的。我不确定那个单元测试这种模式的目的是什么。

1 个答案:

答案 0 :(得分:1)

由于你在嘲笑DbSet,你需要告诉它你想要发生异常。

换句话说,被模拟的DbSet会表现出来(因为你正在使用loose模仿),好像一切都很好;模拟的DbSet没有外键约束的概念 - 更不用说你的域的特定约束 - 因为它实际上不是DbSet,因此永远不会发生错误。

要告诉模拟集你想要Add上的例外,你需要像这样设置entitySet

var myentity = new MyEntity
{
    RefID = "ABCD", //Foreign Key that does not exist in the context
};
entitySet.Setup(p => p.Add(myentity))
         .Throws(new YourForeignKeyConstraintException());

要让SaveChanges方法抛出,只需添加以下行而不是上面的行:

mockContext.Setup(p => p.SaveChanges())
           .Throws(new YourForeignKeyConstraintException());