макет настройки с параметром массива - PullRequest
0 голосов
/ 10 июля 2020

У меня проблема с методами имитации. См. Ниже:

Это интерфейс

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"]) не удалось вызвать фиктивное поведение 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, чтобы он работал? Спасибо

1 Ответ

1 голос
/ 10 июля 2020

Кажется, что в первом случае тест не удастся, потому что два вызова names.Split(',') возвращают разные ссылки для результата string[] и mock setup, а Assert вызываются с другим объектом. Вы должны использовать выражение It.Is для настройки макета , принимая любой массив со значениями A, B, C для CheckNames в первом случае

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));
...