Я пытаюсь сделать модульные тесты для 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");
}
}
}