c# - 起订量错误 : "Expected invocation on the mock at least once, but was never performed"

标签 c# moq botframework

我是 Moq 新手,正在努力解决这个错误。我不太确定为什么会收到我收到的错误。我正在跟踪发现的测试代码 here .

错误:

Moq.MockException: Expected invocation on the mock at least once, but was never performed: c => c.PostAsync(Mock.Object, "You send abc which was 3 characters")

代码

MyTests.cs

[TestClass] 
public class MyTests
{
    private Mock<IChatHelper> _chat;
    private RootDialog _dialog;
    private Mock<IDialogContext> _context;

    public LUISDialogTests()
    {
        _chat = new Mock<IChatHelper>();
        _context = new Mock<IDialogContext>();
        _dialog = new RootDialog(_chat.Object);
    }

    //[SetUp]
    //public void SetUp()
    //{
    //    _chat = new Mock<IChatHelper>();
    //    _dialog = new RootDialog(_chat.Object);
    //    _context = new Mock<IDialogContext>();
    //}

    [TestMethod]
    public async Task Test_CustomerService_Message_LengthAsync()
    {
        var message = Activity.CreateMessageActivity();

        message.Text = "abc";

        _chat.Setup(c => c.PostAsync(_context.Object, message.Text));

        await _dialog.MessageReceivedAsync(_context.Object, Awaitable.FromItem(message));

        _chat.Verify(c => c.PostAsync(_context.Object, "You send abc which was 3 characters"), Times.AtLeastOnce); // Fails here

    }
   }

RootDialog.cs

[Serializable]
public class RootDialog : IDialog<object>
{
  private IChatHelper _chat;

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

public Task StartAsync(IDialogContext context)
{
    context.Wait(MessageReceivedAsync);
    return Task.CompletedTask;
}

public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
    var message = await result as Activity;

    int length = (message.Text ?? string.Empty).Length;

    await _chat.PostAsync(context, $"You sent {message.Text} which was {length} characters");

    context.Wait(MessageReceivedAsync);
}

ChatHelper.cs

 public interface IChatHelper
{
    Task PostAsync(IDialogContext context, string message);
}

[Serializable]
public class ChatHelper : IChatHelper
{
    public async Task PostAsync(IDialogContext context, string message)
    {
        await context.PostAsync(message);
    }
}

需要注意的一点:

  • 我遵循的代码建议使用 [TestFixture] 而不是 [TestClass]。添加 Fixture 后 VS 无法看到测试,因此我切换到测试类

最佳答案

这是您所期待的消息中的一个字符拼写错误。您的测试代码执行以下操作:

await _chat.PostAsync(context, $"You sent {message.Text} which was {length} characters");

并且您正在验证这是否发生:

_chat.Verify(c => c.PostAsync(_context.Object, "You send abc which was 3 characters"), Times.AtLeastOnce); // Fails here

你能看出这两个字符串的区别吗? 已发送 != 发送。更改其中之一,它可能就会开始工作。

关于c# - 起订量错误 : "Expected invocation on the mock at least once, but was never performed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50841729/

相关文章:

c# - 如何在 C# 中更改 DataGridView 中的列宽?

c# - 在 JavaScript 中使用 JSON 字符串

c# - Azure Functions - 无法从 Azure WebJobs SDK 调用

c# - 如何最小起订量 Amazon MWS 的响应以进行单元测试

c# - 您如何在 WCF ServiceAuthorizationManager 中模拟 IContextChannel?

c# - 如何模拟对内存数据执行oracle查询

json - 如何从自适应卡获取消息

c# - 为两种完全不同的类型编写泛型方法

c# - ActivityTypes.Event 不存在用于 BackChannel 通信

javascript - 聊天准备就绪后回调