我在一段复杂的代码中遇到了一个失败的单元测试,而Moq日志记录并不是为我做的。我需要知道,我所期望的方法与实际调用的方法有什么不同。最后,我将调试器附加到单元测试,这样我就可以查看传递给moq的对象,并手动比较它的所有值。如果我从Verify
错误消息中获得更多信息,那么所有这些努力都是不必要的。
我如何记录这两件事之间的区别?
调用的
一个简化的例子:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
namespace MyNamespace
{
[TestClass]
public class MyTestClass
{
[TestMethod]
public void MyTestMethod()
{
// Arrange
var serviceMock = new Mock<IService>();
var model = new Model
{
Word = "Foo",
Number = 1
};
var servicecaller = new ServiceCaller(serviceMock.Object);
// Act
servicecaller.CallService(model);
// Assert
serviceMock.Verify(mock =>
mock.Call(
It.Is<Model>(m =>
m.Word == "Bar"
&& m.Number == 1)));
}
}
public class ServiceCaller
{
private IService _service;
public ServiceCaller(IService service)
{
_service = service;
}
public void CallService(Model model)
{
_service.Call(model);
}
}
public interface IService
{
void Call(Model model);
}
public class Model
{
public int Number { get; set; }
public string Word { get; set; }
}
}
当您运行此测试时,它将失败并显示以下消息:
测试方法MyNamespace.MyTestClass.MyTestMethod至少在模拟上抛出异常: Moq.MockException:预期调用一次,但从未执行过:模拟=> mock.Call(It.Is(m => m.Word ==“Bar& m.Number == 1))没有配置任何设置。执行调用:IService.Call(模型)
但我想让它记录一些内容如下:
执行调用: IService.Call(Model { Word:"Bar",Number: 1 })
甚至更好:
“传递给IService.Call的对象断言失败: Model.Word 'Foo‘不等于'Bar'".
发布于 2020-07-17 04:42:05
您可能需要通过Mock.Invocations
验证调用,这是模拟上所有调用的序列,以及提供的参数。如下所示:
var callInvocations = serviceMock.Invocations.Where(x => x.Method.Name.Equals(nameof(IService.Call)));
var matchingInvocations = callInvocations.Where(x =>
{
var model = x.Arguments.First() as Model;
return model.Word.Equals("Bar") && model.Number == 1;
});
if (!matchingInvocations.Any())
{
throw new Exception($"Performed invocations:{Environment.NewLine}{string.Join(Environment.NewLine, callInvocations.Select(x => $"{x.Method.DeclaringType.Name}.{x.Method.Name}({string.Join(", ", x.Method.GetParameters().Select((y, i) => $"{y.ParameterType.Name} {JsonConvert.SerializeObject(x.Arguments[i])}"))})"))}");
}
将提供所需的输出:
https://stackoverflow.com/questions/62952597
复制相似问题