我对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,以接受第一种情况中CheckNames
的A
、B
、C
值的任何数组
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(',')));
或者对Setup
和Assert
方法使用相同的数组,这似乎在第二种情况下完成(但缺少完整样本(
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));