使用Effort和TypeName属性进行测试

c# dbcontext effort entity-framework unit-testing

我想测试一些代码,为了实现这一点,我需要伪造DAL中定义的DbContext( Entity Framework 6 - Code first )。它的效果非常好,但是当数据模型类使用TypeName属性时,我遇到了一个问题。我做了一个骨架来证明这个问题。

数据模型:

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

上下文定义

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

以及使用某些数据生成虚假上下文的虚拟方法:

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

问题是TypeName属性。当它被注释掉时,测试通过。但是如果启用它,我会抛出一个System.InvalidOperationException ,然后说

Sequence不包含匹配元素

总结一下,我的问题是:

  • 是否有一种方法可以在测试中使用Effort,即使数据模型类具有属性
  • 如果没有,我应该采用什么替代方法来创建一个假的DbContext?

一般承认的答案

我建议你看一下EntityTypeConfigurations并在那里移动你的映射: http//www.entityframeworktutorial.net/code-first/entitytypeconfiguration-class.aspx

它允许您不考虑当前使用的数据库并使用它们测试您的实体/接口,而不考虑实体框架。

在我看来,您正在进行集成测试而不是单元测试。要进行单元测试,你应该摆脱真正的DbContext用法(你当前的实现是使用DAL的具体EF实现,但应该使用一些抽象。)

我建议至少将DbContext包装在一个接口中,这样你就可以更好地模拟它/ stub它:

public interface IDbContext {
      IDbSet<Customer> Customers { get; set; }
}



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因