如何单元测试什么是重写OnModelCreating设置
问题描述:
我使用实体框架6,在我的方面,我已经覆盖OnModelCreating方法:如何单元测试什么是重写OnModelCreating设置
protected override void OnModelCreating(DbModelBuilder modelBuilder)
里面的方法,我建立了数据库配置。我想测试设置。举例来说,我有以下代码:
modelBuilder.HasDefaultSchema("public");
我想有一个单元测试,检查与参数值“公共” HasDefaultSchema之称。
还是喜欢在下面的例子中,我想测试的hasMany和实体用户组的WithMany方法被称为:
modelBuilder.Entity<UserGroup>()
.HasMany<User>(g => g.Users)
.WithMany(u => u.Groups)
.Map(ug =>
{
ug.MapLeftKey("GroupId");
ug.MapRightKey("UserId");
ug.ToTable("UserGroupMembers");
});
请指教。由于
答
你的DbContext显式调用OnModelCreating
和检查的DbModelBuilder
public class TestableMyDbContext : MyDbContext
{
public void TestModelCreation(DbModelBuilder model)
{
OnModelCreating(model);
// check your model an throw an exception if invalid
}
}
状态,您可以创建一个存根在TestMethod的你捕获异常
[TestMethod]
public void Should_Initialize_Context()
{
try
{
var context = new TestableMyDbContext();
context.TestCallback(new DbModelBuilder());
}
catch (Exception ex)
{
Assert.Fail(ex.Message);
}
}
答
要建立在vappolinario的回答,我用Mock<DbModelBuilder>
并将其传入TestableDbContext
,然后验证模拟是否正确调用。
我使用起订量和的xUnit在我的例子
[Fact]
public void MyContext_HasCorrectDefaultSchema()
{
var mockModel = new Mock<DbModelBuilder>();
var context = new TestableMyContext();
context.TestOnModelCreation(mockModel.Object);
mockModel.Verify(m => m.HasDefaultSchema("public"), Times.Once());
}
请问为什么?感觉就像你在测试实现细节,你要写的测试只是你在OnModelCreating中放置的东西的副本?测试这个有什么价值? –
不确定Antipod的原因,但对我来说,当我尝试TDD新应用程序时遇到了这种情况。我知道我必须将默认模式设置为某个值,但我不知道如何编写测试来验证预期的行为,而不诉诸于验证某个方法是否被调用。我检查了'DBContext'的API,但找不到查看使用模型配置的方法。如果有办法,那将是比预期的模拟电话更受欢迎的方法。 – plasmaTonic