2015-12-13 2 views
1

Я бы хотел протестировать некоторый код, и для этого мне нужно подделать DbContext, определенный в DAL (Entity Framework 6 - Code first). Это происходит в основном хорошо, но я столкнулся с проблемой, когда класс модели данных использует атрибут TypeName. Я сделал скелет, чтобы продемонстрировать эту проблему.Тестирование с помощью атрибута Attitude and 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; } 
} 

Контекст определение

public class MyDbContext : DbContext 
{ 
    public MyDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 

    public MyDbContext(DbConnection connection) : base(connection, true) 
    { 
    } 

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

И фиктивный метод для создания поддельного контекста с некоторыми данными:

private MyDbContext GenerateFakeDbContext() 
{ 
    var connection = DbConnectionFactory.CreateTransient(); 
    var context = new MyDbContext(connection); 
    var customer = new Customer 
        { 
         Id = 1, 
         FirstName = "X", 
         LastName = "Y", 
         Salary = 1000 
        }; 
    //this line throws the exception 
    context.Customers.Add(customer); 

    return context; 
} 

Проблемой является TypeName атрибут. Когда он закомментирован, тесты проходят. Но если он включен, я получил System.InvalidOperationException брошенные, говоря

Последовательности не содержит соответствующего элемента

Чтобы подвести итог, мои вопросы:

  • есть способ, который я может использовать Effort в тестах, даже если класс модели данных имеет атрибуты
  • если нет, то какой альтернативный метод я должен использовать для создания поддельного DbContext?
+0

Вы поняли, что хороший выход? Я просто создал другой dbcontext similliar к тому, который я использовал в своем приложении, и сбросил конфигурации datetime2 с его свободного Api –

+0

@ S.Peter да, это работает и для меня – Szeki

ответ

0

Я бы посоветовал вам взглянуть на EntityTypeConfigurations и двигайте отображения есть: http://www.entityframeworktutorial.net/code-first/entitytypeconfiguration-class.aspx

Это позволит Вам не принимать во внимание текущий DB используется и проверить свои лица/интерфейсы, используя их без принимая во внимание Entity Framework.

Он также считает, что вы выполняете интеграционное тестирование вместо модульного тестирования. Чтобы выполнить модульное тестирование, вы должны избавиться от реального использования DbContext (ваша текущая реализация использует конкретную реализацию EF для DAL, но вместо этого должна использоваться абстракция.)

Я бы рекомендовал по крайней мере обернуть DbContext в интерфейсе так что вы могли бы высмеивать его/заглушить его лучшим образом:

public interface IDbContext { 
     IDbSet<Customer> Customers { get; set; } 
} 
Смежные вопросы