c# - 最小起订量错误:“预期在模拟上至少调用一次,但从未执行”
问题描述
我是 Moq 的新手,我正在努力解决这个错误。我不太确定为什么我会收到我收到的错误。我正在关注此处找到的测试代码。
错误:
Moq.MockException:预期在模拟上至少调用一次,但从未执行过:c => c.PostAsync(Mock.Object, "You send abc which was 3 characters")
代码
我的测试.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);
}
聊天助手.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
你能看出这两个字符串的区别吗?sent
!= send
。改变一个或另一个,它可能会开始工作。
推荐阅读
- java - 如何使用对象修复 Spring Boot 中的错误?
- java - 混合身份验证 - 基于 Spring MVC 会话 + 基于 JWT 令牌
- r - 从 lm 对象中获取变量名而不分离因子级别
- kubernetes - 将外部节点添加到 GCP Kubernetes 集群
- amazon-rds - 从 PostgreSQL 9.6.11 升级到 10.7 会给出奇怪的 SETVAL() 语句
- php - 正则表达式匹配一个或多个数字或从 I 到 X 的罗马数字在具有特定前缀的单词之后
- matlab - 如果我使用 filtfilt 会发生相位失真吗?
- java - 如何从条形码将 url 编码为 json
- python - 找到一个向量方向,该向量方向与集合中的所有其他向量方向大致相等地偏离例如 5 度
- python - Pandas 数据框 applymap 并行执行