Я бы хотел протестировать некоторый код, и для этого мне нужно подделать 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?
Вы поняли, что хороший выход? Я просто создал другой dbcontext similliar к тому, который я использовал в своем приложении, и сбросил конфигурации datetime2 с его свободного Api –
@ S.Peter да, это работает и для меня – Szeki