2015-09-28 66 views
4

我使用实体框架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"); 
        }); 

请指教。由于

+0

请问为什么?感觉就像你在测试实现细节,你要写的测试只是你在OnModelCreating中放置的东西的副本?测试这个有什么价值? –

+0

不确定Antipod的原因,但对我来说,当我尝试TDD新应用程序时遇到了这种情况。我知道我必须将默认模式设置为某个值,但我不知道如何编写测试来验证预期的行为,而不诉诸于验证某个方法是否被调用。我检查了'DBContext'的API,但找不到查看使用模型配置的方法。如果有办法,那将是比预期的模拟电话更受欢迎的方法。 – plasmaTonic

回答

0

你的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); 
    }  
} 
0

要建立在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()); 
}