如何使用 bot 框架(Echobot,使用 ITurnContext)进行单元测试设置

我正在尝试为 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 Bot Framework => 但顶部答案中提供的链接都给了我 404..

同样适用于这个单元测试 Bot Framework,遗憾的是:(


测试类目前是这样的:


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。我不知道如何修复此错误,我害怕将自己困在最小起订量漏洞中(如果您明白我的意思)。


我希望我描述的一切都足够好,并且有人可以帮助我!提前致谢 (:


呼啦一阵风
浏览 122回答 1
1回答

守候你守候我

根据你的实现,如果你想Verify如果SendActivityAsync已经用正确的参数调用,你可以创建这样的东西。//Arrangevar mock = new Mock<ITurnContext>();mock.Setup(m => m.Activity).Returns(new Activity(ActivityTypes.Message) {Text = "test"});var sut = new EchoBotBot(Mock.Of<IChatHelper>());//Actawait sut.OnTurnAsync(mock.Object);//Assertmock.Verify(m => m.SendActivityAsync(&nbsp; &nbsp; It.Is<string>(msg => msg == "You sent 'test'\n"),&nbsp;&nbsp; &nbsp; null, //or It.IsAny<string>()&nbsp; &nbsp; "acceptingInput", //or It.IsAny<string>()&nbsp; &nbsp; It.IsAny<CancellationToken>()));
打开App,查看更多内容
随时随地看视频慕课网APP