使用数组参数模拟设置



我对Mocking方法有问题请参阅以下内容:

这是接口

public interface IShop
{
string CheckNames(string[] names);
}

这是我的模拟

var names = "A,B,C";
var shopMock = new Mock<IShop>(MockBehavior.Strict);
shopMock.Setup(s => s.CheckNames(names.Split(','))).Returns("GoodNames");

然而,当我在测试中调用此方法时,此方法因Moq.MockException:IShop而失败。CheckNames(["A"、"B"、"C"](调用因mock行为Strict而失败。

var obj = shopMock.Object;
Assert.AreEqual("GoodNames", obj.CheckNames(names.Split(',')));

为了让它工作,我需要

var names = "A,B,C";
var shopMock = new Mock<IShop>(MockBehavior.Strict);
var nameList = names.Split(',');
shopMock.Setup(s => s.CheckNames(nameList)).Returns("GoodNames");
var obj = shopMock.Object;
Assert.AreEqual("GoodNames", obj.CheckNames(names.Split(',')));

为什么我需要在这里创建nameList才能工作?感谢

在第一种情况下,测试似乎会失败,因为names.Split(',')的两个调用对结果string[]返回不同的引用,而mock setup和Assert是用不同的对象调用的。您应该使用It.Is表达式来设置mock,以接受第一种情况中CheckNamesABC值的任何数组

var names = "A,B,C";

var shopMock = new Mock<IShop>(MockBehavior.Strict);
shopMock.Setup(s =>
s.CheckNames(It.Is<string[]>(_ => _.SequenceEqual(names.Split(',', StringSplitOptions.None)))))
.Returns("GoodNames");
var obj = shopMock.Object;
Assert.Equal("GoodNames", obj.CheckNames(names.Split(',')));

或者对SetupAssert方法使用相同的数组,这似乎在第二种情况下完成(但缺少完整样本(

var names = "A,B,C";
var nameList = names.Split(',');
var shopMock = new Mock<IShop>(MockBehavior.Strict);
shopMock.Setup(s => s.CheckNames(nameList)).Returns("GoodNames");
var obj = shopMock.Object;
Assert.Equal("GoodNames", obj.CheckNames(nameList));

最新更新