2016-12-21 1 views
2

У меня есть метод, который я пытаюсь издеваться, используя NSubstitute:Mock член-колл, когда параметры не совпадают точно

Foo MyMethod(IEnumerable<string> args); 

Я хочу способ вернуть new Foo { ID = 1 } для вызова, где args -collection имеет ровно один элемент под названием "Item1". Однако, когда коллекция содержит только "Item2", я хотел бы вернуть еще один экземпляр Foo.

Так что я написал этот код:

var mock = Substitute.For<MyType>(); 
mock.MyMethod(new[] { "Item1" }).Returns(new Foo { ID = 1 }); 
mock.MyMethod(new[] { "Item2" }).Returns(new Foo { ID = 2 }); 

В моем вызывающем коде у меня есть что-то вроде этого:

var foo = myType.MyMethod(new[] { "Item1" }); 

Однако издеваться не правда выполнен в виде массивов сравнены с использованием референс-равенства. Так как у меня есть два экземпляра от string[], делясь одинаковыми значениями, они считаются неравными, и поэтому мы не переходим к издеваемому возврату-заявлению.

Итак, что бы я хотел достичь, не имеет значения, какой именно тип коллекции мы предоставляем методу, который макет должен просто различать по элементам коллекций.

ответ

3

Вы можете использовать синтаксис Arg.Is сделать сами проверить:

mock.MyMethod(Arg.Is<string[]>(a => a.Contains("Item1"))).Returns(new Foo { ID = 1 }); 
mock.MyMethod(Arg.Is<string[]>(a => a.Contains("Item2"))).Returns(new Foo { ID = 2 }); 

Смотрите здесь для получения дополнительной информации: http://nsubstitute.github.io/help/return-for-args/

+0

Я изменил 'Contains' проверку в' a.Single() == «Item1» ', чтобы убедиться, что есть ровно один элемент *, а его значение -« Item1 ». Однако это то, что я искал. – HimBromBeere

+0

Ах, да, вы можете сделать что-нибудь там, пока это действительное выражение. Я не знаю о NSubstitute, но, по крайней мере, с помощью Moq вы не можете делать определенные вещи, такие как необязательные переменные и подобные – Kenneth