Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / xUnitTest контроллера c MediatR (Asp.net Core) / 15 сообщений из 15, страница 1 из 1
20.09.2019, 14:59
    #39864669
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
Понимаю, что проблема в инициализации медиатора в тесте,
НО не могу понять в как его правильно заинитить, чтобы протестить контроллер


Текст контроллера
Код: 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.
using System;
using System.Threading.Tasks;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using MyGlobal.Contracts.Request;
using MyGlobal.Contracts.Response;

namespace MyGlobal.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class MediatrController : ControllerBase
    {
        readonly IMediator _mediator;

        public MediatrController(IMediator mediator)
        {
            _mediator = mediator;
        }

        [HttpPost]
        public async Task<MyPipeResponse> Calc_Price(int size = 100)
        {
            MyPipeRequest request = new MyPipeRequest();

            request.Data = JToken.FromObject(new Request_Calc_Price()
            {
                Size = size,
            });


// - при обычном вызове через swagger методa "Calc_Price" все Ок: хендлер вызывается, происходит расчет и возвращается результат
// - при вызове через тест xUnit доходит до вызова await _mediator.Send(request) и ничего не происходит дальше
//   возвращается null

            return await _mediator.Send(request);
        }
    }
}



Текст теста:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
namespace MyGlobal.XUnitTest
{

    public class Controller_Test
    {
        [Fact]
        public async Task Calc_Price_test()
        {
            // Arrange
            var mockMediator = new Mock<IMediator>(); // <<<< имхо проблема вот тут!!!
            var controller = new MediatrController(mockMediator.Object)

            int _size = 200;

            // Act
            var result = await controller.Calc_Price(size: _size); // result = null

            // Assert
            var resultType = Assert.IsType<MyPipeResponse>(result);

        }
    }
}
...
Рейтинг: 0 / 0
20.09.2019, 16:18
    #39864752
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
поведение не хочешь задать?
...
Рейтинг: 0 / 0
20.09.2019, 16:57
    #39864783
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
handmadeFromRuповедение не хочешь задать?
Мне подойдет любой вариант
...
Рейтинг: 0 / 0
20.09.2019, 21:48
    #39864865
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
RegisteredUserНО не могу понять в как его правильно заинитить, чтобы протестить контроллер

Словами выразите, что должен содержать тест.
...
Рейтинг: 0 / 0
23.09.2019, 09:24
    #39865400
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
hVosttRegisteredUserНО не могу понять в как его правильно заинитить, чтобы протестить контроллер

Словами выразите, что должен содержать тест.

Тест должен тестировать работу контроллера.
Т.е. я должен передать в контроллер Size и получить правильный ответ.
...
Рейтинг: 0 / 0
23.09.2019, 09:33
    #39865409
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
Код: c#
1.
var mockMediator = new Mock<IMediator>(); 



так он ничего не делает. Замокай его, чтобы он что-то делал, причем, возвращал стартанутую Task
...
Рейтинг: 0 / 0
23.09.2019, 10:36
    #39865453
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
love_bach
Код: c#
1.
var mockMediator = new Mock<IMediator>(); 



так он ничего не делает. Замокай его, чтобы он что-то делал, причем, возвращал стартанутую Task
так вот тут и вопрос: как это сделать?
авторстартанутую Task - ты имеешь в виду метод Startup

этот?
Код: c#
1.
2.
3.
4.
5.
        public Startup(IConfiguration configuration, IHostingEnvironment environment)
        {
            Configuration = configuration;
            Environment = environment;
        }
...
Рейтинг: 0 / 0
23.09.2019, 10:59
    #39865474
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
RegisteredUserlove_bach
Код: c#
1.
var mockMediator = new Mock<IMediator>(); 



так он ничего не делает. Замокай его, чтобы он что-то делал, причем, возвращал стартанутую Task
так вот тут и вопрос: как это сделать?
авторстартанутую Task - ты имеешь в виду метод Startup

этот?
Код: c#
1.
2.
3.
4.
5.
        public Startup(IConfiguration configuration, IHostingEnvironment environment)
        {
            Configuration = configuration;
            Environment = environment;
        }



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var mockMediator = new Mock<IMediator>(MockBehavior.Strict);
mockMediator
    .Setup(x => x.Send(It.IsAny<MyPipeRequest>()))
    .Returns(() =>
     {
            var t = new Task<MyPipeResponse>(() =>
                new MyPipeResponse
                {
                        //
                });

              t.Start();
              return t;
       });
...
Рейтинг: 0 / 0
23.09.2019, 12:38
    #39865550
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
love_bach
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var mockMediator = new Mock<IMediator>(MockBehavior.Strict);
mockMediator
    .Setup(x => x.Send(It.IsAny<MyPipeRequest>()))
    .Returns(() =>
     {
            var t = new Task<MyPipeResponse>(() =>
                new MyPipeResponse
                {
                        //
                });

              t.Start();
              return t;
       });


ТС это и есть задать поведение о чем я писал.
...
Рейтинг: 0 / 0
23.09.2019, 12:56
    #39865566
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
RegisteredUserТ.е. я должен передать в контроллер Size и получить правильный ответ.

Именно этого вы не сделали. Проверку передачи и проверку получения правильного ответа.
...
Рейтинг: 0 / 0
23.09.2019, 14:04
    #39865632
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
hVosttRegisteredUserТ.е. я должен передать в контроллер Size и получить правильный ответ.

Именно этого вы не сделали. Проверку передачи и проверку получения правильного ответа.

в этом и был мой вопрос )
если бы я знал КАК ЭТО СДЕЛАТЬ , то не спрашивал бы
...
Рейтинг: 0 / 0
23.09.2019, 14:19
    #39865651
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
RegisteredUserв этом и был мой вопрос )
если бы я знал КАК ЭТО СДЕЛАТЬ , то не спрашивал бы

Я написал это к тому, что нужно явно выражать намерения в виде понятных шагов, что вы хотите сделать.
Это вам поможет решать задачи даже без внешней помощи.
...
Рейтинг: 0 / 0
23.09.2019, 16:15
    #39865757
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
handmadeFromRulove_bach
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var mockMediator = new Mock<IMediator>(MockBehavior.Strict);
mockMediator
    .Setup(x => x.Send(It.IsAny<MyPipeRequest>()))
    .Returns(() =>
     {
            var t = new Task<MyPipeResponse>(() =>
                new MyPipeResponse
                {
                        //
                });

              t.Start();
              return t;
       });


ТС это и есть задать поведение о чем я писал.

Соррян за тупость!
НО подскажите уж, как же мне вызвать реальный метод ( Calc_Price(300) ) из контроллера?
Мне же его надо тестить.
Что надо прописать в .Returns(() =>... ?
...
Рейтинг: 0 / 0
24.09.2019, 10:54
    #39866125
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
RegisteredUserhandmadeFromRuпропущено...

ТС это и есть задать поведение о чем я писал.

Соррян за тупость!
НО подскажите уж, как же мне вызвать реальный метод ( Calc_Price(300) ) из контроллера?
Мне же его надо тестить.
Что надо прописать в .Returns(() =>... ?

т.е. по http дернуть контроллер со всем окружением и зависимостями?
см. тогда end-2-end тесты, и, например, сюда - WebApplicationFactory
...
Рейтинг: 0 / 0
15.09.2020, 15:33
    #39998845
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xUnitTest контроллера c MediatR (Asp.net Core)
Кому интересно, как это сделать, смотрите сюда
Creating Web API in ASP.NET Core 2.0

Рабочая схема!
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / xUnitTest контроллера c MediatR (Asp.net Core) / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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