Как добавить DbContext в проект MSTest? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь протестировать некоторый код, который использует Entity Framework, но не могу понять, как ссылаться на классы EF Context из отдельного проекта MSTest. Оба проекта находятся в одном решении.

Невозможно преобразовать лямбда-выражение в тип 'DbContextOptions', так как оно не является типом делегата

В моем тестовом случае:

[TestClass]
public class GreenCardUserTest
{
    [TestMethod]
    public void TestAddUser()
    {
        // REFERENCE TO OTHER PROJECT. WORKS FINE
        AppUserViewModel a = new AppUserViewModel();

        //LIKELY INCORRECT attempt to duplicate code from Startup.cs in other project
        using (GreenCardContext _gc = new GreenCardContext(options => options.UseSqlServer(Configuration.GetConnectionString("MyConnection"))))
        {
            new GCLandingUserModel().AddUser(a,_gc);
        }
    }
}

Выдержка из основного проекта Startup.cs (который отлично работает):

services.AddDbContext<GreenCardContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MyConnection")));

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Что вам нужно сделать, это:

1) Добавить ссылку в вашем тестовом проекте в проект вашего контекста (если вы этого еще не сделали)

2) Добавьте ссылки на Entity Framework в ваш тестовый проект

3) Добавьте appconfig в ваш тестовый проект и установите на нем конфигурацию Entity Framework. Ваш тест будет читать конфигурацию из своего собственного конфига, а не из вашего приложения. Очень полезно, так как вы можете, например, использовать dblocal и codefirst в тестах и ​​sqlserver при запуске:)

Вы сделали кое-что из этого, я думаю, что вы упускаете третий пункт:)

0 голосов
/ 14 января 2019

Я бы предложил использовать InMemoryDatabase:

в вашем тестовом классе, используйте [TestInitialize] для настройки фиктивной базы данных:

[TestClass]
public class GreenCardUserTest
{
    private readonly context;

    [TestInitialize]
    public Setup()
    {
        DbContextOptions<GreenCardContext> options;
        var builder = new DbContextOptionsBuilder<GreenCardContext>();
        builder.UseInMemoryDatabase();
        var options = builder.Options;
        context = new GreenCardContext(options);
    }

    [TestMethod]
    public void TestAddUser()
    {
        // user context here...
    }
}
0 голосов
/ 14 января 2019

Код, который вы получили из Startup.cs, использует делегата, чтобы сообщить вашему приложению, как создать ваш DbContext во время выполнения.

Однако в вашем тесте вам нужно предоставить экземпляр DbContextOptions, а не просто делегата. Для этого вы можете использовать DbContextOptionsBuilder:

var options = new DbContextOptionsBuilder<GreenCardContext>() 
.UseSqlServer(Configuration.GetConnectionString("MyConnection"))
.Options;

using (GreenCardContext _gc = new GreenCardContext(options)) 
{ 
    new GCLandingUserModel().AddUser(a,_gc);
}

Кроме того, если вы настаиваете на модульном тестировании вашего DbConext, вы можете рассмотреть возможность использования InMemoryDatabase, чтобы вам не требовалось открытое соединение SQL в ваших тестах. См. этот документ для более подробной информации.

...