2015-10-16 1 views
0

Я пытаюсь проверить вызов метода, который принимает параметр типа Expression<Func<T, U>>, но я не могу заставить NSubstitute его распознать.Может ли NSubstitute проверять вызовы, которые принимают выражение <T>?

public interface IFoo<T> 
{ 
    void DoThing<TProperty>(TProperty i, Expression<Func<T, TProperty>> expression); 
} 

// this almost works, but throws AmbiguousArgumentException 
myFoo.Received(1).DoThing(Arg.Is(10), Arg.Any<Expression<Func<MyClassType, long>>>()); 
+0

Что myObj? Можете ли вы опубликовать его структуру? –

+0

Как определяется 'myObj', должно быть неактуально. В моем реальном случае 'myObj' реализует интерфейс, который определяет' DoThing'. Он может быть полностью пустым, за исключением одного метода. В моем методе тестирования 'myObj' является подстановкой NSubstitute. – moswald

+1

Я спрашиваю, потому что в моих тестах я не смог воспроизвести поведение, которое вы видите. Однако мои предположения относительно сигнатуры метода DoThing могут быть неправильными. Можете ли вы поделиться определением метода? –

ответ

0

Итак, пытаясь выяснить, почему мои тесты не удались, но Дэвид Чепак работал, я понял, что мой первоначальный вопрос не включал в себя тот факт, что тип свойства также был общим (вопрос был обновлен). Когда я внес изменения в код Дэвида, я начал видеть те же ошибки, что и в моем исходном коде.

Я нашел решение, однако:

// fails with AmbiguousArgumentException 
myObj.Received(1).DoThing(Arg.Is(10), Arg.Any<Expression<Fun<MyClassType, long>>>()); 

// passes, but doesn't validate first parameter 
myObj.Received(1).DoThing(Arg.Any<long>(), Arg.Any<Expression<Fun<MyClassType, long>>>()); 

// passes, _and_validates first parameter 
myObj.Received(1).DoThing(10, Arg.Any<Expression<Fun<MyClassType, long>>>()); 

// passes, _and_validates first parameter 
myObj.Received(1).DoThing(Arg.Is<long>(10), Arg.Any<Expression<Fun<MyClassType, long>>>()); 
1

Да NSubstitute может работать с вызовами, которые принимают выражения. Для меня проходит следующее испытание:

public class MyClassType { 
    public long Property { get; set; } 
} 
public interface IFoo { 
    void DoThing(int i, Expression<Func<MyClassType, long>> expression); 
} 

[Test] 
public void ReceivedWithAnyExpression() { 
    var myObj = Substitute.For<IFoo>(); 
    myObj.DoThing (10, x => x.Property); 
    myObj.Received(1).DoThing(Arg.Is(10), Arg.Any<Expression<Func<MyClassType, long>>>()); 
} 

Какая ошибка компиляции вы получаете?

+0

Моя ошибка. Это не ошибка компиляции (возможно, раньше у меня была опечатка). Я работаю над различиями. Я обновляю свой пост, когда сужу его до истинной проблемы. – moswald

+0

Ваш ответ в конце концов помог мне найти правильный ответ. Благодаря! – moswald

Смежные вопросы