powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
24 сообщений из 24, страница 1 из 1
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992158
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь сделать прирожения ASP.NET MVC WEBAPI по примеру c Generic Repository и UnitOfWork.
Само приложение работает нормально, но возникла необходимость написать юнит тесты.
Для тестирования использую библиотеку Moq . Нужно протестировать 4 CRUD метода.
Я создаю mock-объект в отдельном методе как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 private IRepository<Country> CreateMockRepository()
        {
            Mock<IRepository<Country>> mock = new Mock<IRepository<Country>>();
            mock.Setup(m => m.Table).Returns(new Country[]
            {
                new Country {ID =1, Name ="Country1" },
                new Country {ID =2, Name ="Country2" }
            }.AsQueryable());

            return mock.Object;
        }


IRepository - интерфейс generic хранилища который объявляет в основном CRUD
Country - моя таблица с 2 полями
Дальше делаю метод для тестирования Post-метода
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
[TestMethod]
    public void Insert_Country()
    {
        //Arrange - create mock repository               
        var moq = CreateMockRepository();

        //Arrange - create a controller

        var config = new HttpConfiguration();
        var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/country");
        var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}");
        var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "country" } });
        CountryController target = new CountryController(moq);
        target.ControllerContext = new HttpControllerContext(config, routeData, request);
        target.Request = request;
        target.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

        Country newCountry = new Country(){ ID = 10, Name = "TEST" };

        //Action
        var result = target.Post(newCountry);
        var result2 = target.Get().ToArray();

        //Assert 1
        Assert.AreEqual(HttpStatusCode.Created, result.StatusCode);            

        //Assert 2
        Assert.AreEqual(3, result2.Length);
    }


В результатке Assert1 проходит но Assert2 возвращает всеравно 2 записи.
Подскажите пожалуйста что я делаю не там? Если нужно буде мой код реализации контроллера, UnitOfWork.cs и класа который реализует репозиторий, я скину позже
Заранее благодарен
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992159
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извиняюсь за ошибки в тексте :-)
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992181
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusyk, дак а как Вы реализовали добавление?

У Вас каждый раз свойство IRepository.Table новый массив ( new Country[] ) ровно из двух элементов возвращается.
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992344
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как То так, я все делал по примеру. я так понимаю что для тестирования такой вариант не подходит изза того что здесь я роботаю з контекстом, да?
=class EFRepository<T> : IRepository<T>
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
public class EFRepository<T> : IRepository<T> where T : BaseEntity
    {
        private readonly EFDbContext context;
        private IDbSet<T> entities;
        private string errorMessage = string.Empty;

        public EFRepository(EFDbContext context)
        {
            this.context = context;
        }

        public void Insert(T entity)
        {
            try
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity");
                }
                this.Entities.Add(entity);
                this.context.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        errorMessage += string.Format("Property: {0} Error: {1}",
                        validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
                    }
                }
                throw new Exception(errorMessage, dbEx);
            }
        }

        public IQueryable<T> Table
        {
            get
            {
                return this.Entities;
            }
        }

        public IDbSet<T> Entities
        {
            get
            {
                if (entities == null)
                {
                    entities = context.Set<T>();
                }
                return entities;
            }
        }

    }

...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992369
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusyk,

почему бы и не потестировать на отладочной базе
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992385
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Развели энтерпрайз на ровном месте.
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992409
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris,

В принципе можно и на базе но хотелось бы сделать это независимо от базы.
В нете читал что правильный подход к тестированию это использование mock обьектов и нашел полно примеров но пока реализовать не удалось
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992432
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusyk,

сделай для тестов простенький репозиторий (не мок!), который будет в памяти работать c неким List<>
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992600
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть решение. в моке было задано только возвращение коллекции стран но не задана их вставка/сохранение.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private IRepository<Country> CreateMockRepository()
{
    var countries = new List<Country> {
        new Country { ID=1, Name="Country1" },
        new Country { ID=2, Name="Country2" }
    };

    Mock<IRepository<Country>> mock = new Mock<IRepository<Country>>();

    mock.Setup(m => m.Table).Returns(countries.AsQueryable());

    mock.Setup(m => m.Insert(It.IsAny<Country>()))
        .Callback<Country>(c => countries.Add(c));

    return mock.Object;
}
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992743
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusykPallaris,

В принципе можно и на базе но хотелось бы сделать это независимо от базы.
В нете читал что правильный подход к тестированию это использование mock обьектов и нашел полно примеров но пока реализовать не удалосьЕсли на базе, то это будет так называемый Интеграционный тест , что тоже есть правильный подход. Читайте дальше :)
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992748
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusykесть решение. в моке было задано только возвращение коллекции стран но не задана их вставка/сохранениеЯ про это сразу и спросил.

Достаёте через свойство, вставляете через метод... Дела :)
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992749
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На фига Entities наружу тогда торчит? :)
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992808
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

потому что я использую интерфейс IRepository и не могу сделать private
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38992862
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusykесть решение. в моке было задано только возвращение коллекции стран но не задана их вставка/сохранение.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private IRepository<Country> CreateMockRepository()
{
    var countries = new List<Country> {
        new Country { ID=1, Name="Country1" },
        new Country { ID=2, Name="Country2" }
    };

    Mock<IRepository<Country>> mock = new Mock<IRepository<Country>>();

    mock.Setup(m => m.Table).Returns(countries.AsQueryable());

    mock.Setup(m => m.Insert(It.IsAny<Country>()))
        .Callback<Country>(c => countries.Add(c));

    return mock.Object;
}



Не вижу смысла тут использовать мок, зачем? Можно за 5 минут сделать полноценный класс вставки/удаления/изменения в List<> и обернуть его в IRepository. Будет читабельнее, чем городить вырвиглазный CRUD на моке.
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38993041
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusykskyANA,

потому что я использую интерфейс IRepository и не могу сделать privateДак уберите из интерфейса лишнее свойство.
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38993042
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisRomaMarusykесть решение. в моке было задано только возвращение коллекции стран но не задана их вставка/сохранение.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private IRepository<Country> CreateMockRepository()
{
    var countries = new List<Country> {
        new Country { ID=1, Name="Country1" },
        new Country { ID=2, Name="Country2" }
    };

    Mock<IRepository<Country>> mock = new Mock<IRepository<Country>>();

    mock.Setup(m => m.Table).Returns(countries.AsQueryable());

    mock.Setup(m => m.Insert(It.IsAny<Country>()))
        .Callback<Country>(c => countries.Add(c));

    return mock.Object;
}



Не вижу смысла тут использовать мок, зачем? Можно за 5 минут сделать полноценный класс вставки/удаления/изменения в List<> и обернуть его в IRepository. Будет читабельнее, чем городить вырвиглазный CRUD на моке.
Moq
- это модно :)

Ну и позвляет засетапить только то, что тебе нужно в конкретных тестах. А не оставлять большую часть методов с внутренностями вида:

Код: c#
1.
throw new NotImplementedException();
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38993047
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Спасибо большое

skyANA Moq - это модно :)


да, и это моя основная причина его использования, спасибо
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38993094
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusykskyANA Moq - это модно :)


да, и это моя основная причина его использования, спасибо
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38993097
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-то по наивности, думал, что нахожусь на АйТи форуме, а нет - оказывается, на форуме высокой моды :)
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38993261
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron, открой словарь русских синонимов к слову модный: популярный, ходкий, употребительный, современный; в моде, в употреблении, в ходу, обыкновенный.

Moq - это современный и популярный инструмент, используемый при написании тестов.

Жги!
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38998753
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANARomaMarusykPallaris,

В принципе можно и на базе но хотелось бы сделать это независимо от базы.
В нете читал что правильный подход к тестированию это использование mock обьектов и нашел полно примеров но пока реализовать не удалосьЕсли на базе, то это будет так называемый Интеграционный тест , что тоже есть правильный подход. Читайте дальше :)

Так он и хочет интегрального теста, т.к. в одном тесте
1. записать в заглушку
2. прочитать что записал в заглушку (очень нужное/полезное действо)

при этом пытается использовать инструментарий юниттетсирования. Удивляется как все нелепо получается, но верит в то, что он делает. Т.е. смело и модно идет против системы.
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38998914
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazaea,

Нет, Вы не правы! Мне нужен иммено юнит тест который не использует базу данных а только симулирует хранилище.
Просто Вы слабо разбираетесь в тестах. Суть теста не в том чтобы прочитать записанные данные а в том чтобы проследить как влияют изменения в методе который тестируется на обработку данных.
У меня есть входные данные и результат результат который должен получиться. Значит мне нужно подстраивать свой метод под ожидаемый результат. Если я внесу изменения в обработку данных тогда есть вероятность того что фактический результат может не совпадать с ожидаемым, и тест мне об этом сообщит
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #38999203
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomaMarusyk,

так и тестируйте правильно. отдельно запись, отдельно чтение.
Код: c#
1.
2.
3.
4.
5.
6.
  public void Post(Country value)
        {
            /* тут код который вы проверяете этим юнит тестом, например валидация, проверка секьюрности и т.д.  */
          _IRepository.Insert(value);  // тут вы  используете заглушку созданую при помощи moq 
            /* тут код который вы проверяете этим юнит тестом, например валидация, проверка секьюрности и т.д.  */
        }




Реализацию _IRepository.Insert(value); - вы должны тестировать отдельно, но зачем-то проверяете работоспособность заглушки
Чтение данных (Get) - вы должны тестировать отдельно

У меня есть входные данные и результат результат который должен получиться.

результат который должен получиться - это возвращаемые значения/выпавшие исключения, а не значения из непонятно как работающего Get.
...
Рейтинг: 0 / 0
ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
    #39000979
Фотография RomaMarusyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazaea,

если Вы не поняли вопроса то я повторю, я спрашивал о том как настроить Moq а не как правильно писать тесты.
если вам нечего предложить по данной теме тогда прошу не путать с темой "Научите меня правильно писать юнит тесты"
проблема была с именно мок и она уже решена, но спасибо что переживаете за мои тесты
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET WebAPI UnitTest используя Moq с Generic Repository и UnitOfWork
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]