Как я могу использовать Moq для тестирования метода, который создает новый DbContext? - PullRequest
0 голосов
/ 04 мая 2020

Я использую: MSTest, Entity Framework 6 и Moq

Я пытаюсь изучить TDD с нашей уже существующей структурой сущностей asp. net. Сейчас я работаю в нашем веб-интерфейсе, я создал тестовый проект и класс fre sh и пытаюсь написать тест, чтобы посмотреть, смогу ли я вернуть хотя бы одно значение. Поэтому в некоторых местах мне, очевидно, приходится писать тесты для кода, который уже существует.

Здесь я не могу понять, если / как настроить мой тестовый проект, класс или метод (не уверен, что нужно настроить) для тестирования этого метода

[HttpGet]
[ResponseType(typeof(IEnumerable<TimeZoneDTO>))]
[Route("api/timezone")]
public IHttpActionResult GetTimeZones()
{
    var _out = new IEnumerable<TimeZoneDTO>();
    using (var db = new Entities())
    {
        _out = from x in db.Timezones
               orderby x.UTCOffSet descending
               select new TimeZoneDTO() {
                   Caption = x.Name,
                   Id = x.Abbreviation
               };
    }

    return Ok(_out);
}

проблема в том, что using (var db = new Entities()) зависит от именованной строки конфигурации базы данных в файле web.config проекта контроллера.

public partial class Entities : DbContext
{
    public Entities(): base("name=Entities") {}

    ...
}

Какие у меня варианты здесь? Есть ли способ заставить Moq справиться с этим или мне нужно как-то обновить тестовый проект? Чего я не хочу делать (на данный момент), так это переделать что-то, что заставит меня изменить другие основные части приложения.

1 Ответ

1 голос
/ 04 мая 2020

Типичным способом обработки подобных ситуаций является изменение класса, который вы тестируете, чтобы он внедрял либо сам DbContext, либо фабрику, производящую DbContext. Таким образом, вместо того, чтобы new самостоятельно вызывать DbContext, он использует конфигурацию внедрения зависимостей для определения того, как создается DbContext. Затем вы можете макетировать DbContext (используя фиктивную или фальшивую фабрику, если вы go Фабричный маршрут).

...