Тестирование приложения на основе EF SQL Server с SQLite в памяти? - PullRequest
2 голосов
/ 03 марта 2010

Я использую SQL Server с Entity Framework для разработки веб-приложения в .NET 4 с VS2010 RC. Я хотел бы подготовить тестовую базу данных с образцами данных.

Должен ли я подготовить копию реальной базы данных (скажем, другую базу данных SQL Server) для тестирования или использовать SQLite в памяти для повышения производительности?

Если я использую SQLite, могу ли я использовать ту же модель, которую EF создал для базы данных SQL Server? Как перенести схему из SQL Server в SQLite в памяти?

Как вы тестируете свой код, который использует EF с SQL Server?

Спасибо, что поделились.

1 Ответ

2 голосов
/ 03 марта 2010

Я использую LINQ to Objects и DI.

Допустим, у меня есть служба, которая использует репозиторий:

public FooService : Service, IFooService
{
    private IFooRepository Repository { get; set; }

    public GetSpecialFoos()
    {
        return from f in Repository.SelectAll()
               where f.IsSpecial
               select f;
    }

    public FooService(IFooRepository repository)
    {
        this.Repository = repository;
    }
}

Теперь я могу использовать инжектор конструктора, чтобы внедрить фиктивный репозиторий для тестирования. Как правило, вы бы использовали DI-фреймворк для этого. Но главное, что репозиторий может использовать LINQ to Objects:

public MockFooRepository : IFooRepository
{
     public IList<Foo> Data { get; set; }

     public IQueryable<Foo> SelectAll()
     {
         return Data.AsQueryable();
     }
}

Теперь я могу проверить:

[TestMethod]
public void GetSpecialFoos_returns_only_special_foos()
{
    var specialId = 1;
    var notSoSpecialId = 2;
    var foos = new List<Foo> 
    {
         new Foo
         {
             Id = specialId,
             IsSpecial = true
         },
         new Foo
         {
             Id = notSoSpecialId,
             IsSpecial = false
         }
    }
    // use a DI framework here instead, in the real world
    var repository = new MockFooRepository
    {
        Data = foos
    };
    var service = new FooService(repository);

    var actual = service.GetSpecialFoos();

    var returned = actual.First();
    Assert.AreEqual(true, returned.IsSpecial);
    Assert.AreEqual(specialId, returned.Id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...