Как сделать настройку для модульного тестирования с помощью платформы ботов (Echobot, используя ITurnContext) - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь сделать модульные тесты для Echobot (просто чтобы понять, как он работает, чтобы я мог использовать его для своего реального бота), но есть одна проблема, которую я не могу исправить.Проблема, с которой я сталкиваюсь, заключается в том, что я использую ITurnContext, и каждый встреченный мной пример использует DialogContext (с IWaitable для отправки сообщения).ITurnContext доступен только для чтения, поэтому я не могу ничего в него установить, если я не сделаю это в классе SetUp, что не очень красиво - но это сработало, поэтому я продолжил просто смотреть, что произойдет, и получил ошибку:

Message: Moq.MockException : 
Expected invocation on the mock at least once, but was never performed: c => c.PostAsync(Mock<Microsoft.Bot.Builder.ITurnContext:00000001>.Object, "You sent 'test'")
No setups configured.
No invocations performed.

Для начала я использовал это руководство для запуска: https://medium.com/@createdincode/simple-unit-testing-in-microsofts-c-bot-framework-with-nunit-and-moq-345b805ecd1b
После того, как я столкнулся с некоторыми проблемами, я попытался выполнить поиск в Интернете и наткнулся на эту тему: Автоматическое тестирование для Microsoft BotFramework => но ссылки в верхнем ответе дают 404 ..То же самое касается этого модульного тестирования Bot Framework , к сожалению :(

Класс Test в настоящее время таков:

namespace EchoBot.UnitTest
{
    [TestFixture]
    class EchoTest
    {
        private Mock<IChatHelper> _chat;
        private EchoBotBot _echobot;
        private Mock<ITurnContext> _context;

        [SetUp]
        public void SetUp()
        {
            _chat = new Mock<IChatHelper>();
            _echobot = new EchoBotBot(_chat.Object);

            var activity = new Activity(ActivityTypes.Message);
            activity.Text = "test";

            _context = new Mock<ITurnContext>();

            _context.Setup(c => c.Activity).Returns(activity);
        }

        [Test]
        public async Task echoBackTest()
        {

            await _echobot.OnTurnAsync(_context.Object);

            _chat.Verify(c => c.PostAsync(_context.Object, "You sent 'test'"));

        }

    }
}

И класс Helper такой же, как и руководство, которое я отправляю, за исключением того, что я изменил DialogContext на ITurnContext.Я не знаю, как исправить эту ошибку, и я боюсь оказаться в ловушке внутри дыры Moq (если вы понимаете, о чем я).

Надеюсь, я все описал достаточно хорошо, и что кто-то может мне помочь!Заранее спасибо (:

РЕДАКТИРОВАТЬ: код EchoBot

public class EchoBotBot : IBot
    {
        private readonly EchoBotAccessors _accessors;
        private readonly ILogger _logger;

        private IChatHelper _chat;

        public EchoBotBot(IChatHelper chat)
        {
            _chat = chat;
        }

        public EchoBotBot(ConversationState conversationState)
        {
            if (conversationState == null)
            {
                throw new System.ArgumentNullException(nameof(conversationState));
            }

        }


        public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
        {

            if (turnContext.Activity.Type == ActivityTypes.Message)
            {

                var responseMessage = $"You sent '{turnContext.Activity.Text}'\n";
                await turnContext.SendActivityAsync(responseMessage);
            }
            else
            {
                await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected");
            }
        }
    }

1 Ответ

0 голосов
/ 23 апреля 2019

На основе вашей реализации, если вы хотите Verify, если SendActivityAsync был вызван с правильными аргументами, вы можете создать что-то вроде этого.

//Arrange
var mock = new Mock<ITurnContext>();
mock.Setup(m => m.Activity).Returns(new Activity(ActivityTypes.Message) {Text = "test"});

var sut = new EchoBotBot(Mock.Of<IChatHelper>());

//Act
await sut.OnTurnAsync(mock.Object);

//Assert
mock.Verify(m => m.SendActivityAsync(
    It.Is<string>(msg => msg == "You sent 'test'\n"), 
    null, //or It.IsAny<string>()
    "acceptingInput", //or It.IsAny<string>()
    It.IsAny<CancellationToken>()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...