2013-08-12 13 views
0

Используя Moq, я пытаюсь настроить метод для возврата чего-либо в зависимости от аргумента. Итак, если вы проходите argument1, вы получите result1 назад, и если вы проходите argument2 вы получите result2:Настройки и закрытие Moq

var obj = ""; 

var propertyMock1 = new Mock<PropertyInfo>(); 
var propertyMock2 = new Mock<PropertyInfo>(); 

var result1 = ""; 
var result2 = ""; 

var factoryMock = new Mock<IFactory>(); 
factoryMock.Setup(f => f.Create(obj, propertyMock1.Object)).Returns(result1); 
factoryMock.Setup(f => f.Create(obj, propertyMock2.Object)).Returns(result2); 

Однако, когда я называю factoryMock.Object.Create(obj, propertyMock1.Object), возвращаемое значение является null. Если я пройду propertyMock2.Object, он будет работать как ожидалось.

Я понятия не имею, почему первая установка не работает.

ReSharper дает мне несколько советов, хотя я не понимаю. В первой настройке он говорит «Неявно зафиксированное закрытие: свойство2», а во второй настройке он говорит «Неявно зафиксированное закрытие: свойство1».

Почему каждый лямбда должен захватывать другой аргумент лямбды? Как они связаны? И почему первая настройка не работает?

+0

Уверены ли вы, что вы точно связаны с кодом, который вы вставили? Например, в вашем коде нет «свойства2». – BartoszKP

+0

Как вы называете метод 'Create()'? Не похоже, чтобы какой-либо проект имел тот же самый издеваемый класс, который был вызван с помощью двух разных значений, издевавшихся над тестируемым кодом. У вас есть инсталляция конструктора, которая проходит в последовательности или массиве или двух бок о бок PropertyInfos? См. Мой ответ ниже для возможного решения. –

+0

@BartoszKP: Плохо, я имел в виду «propertyMock2». – dcastro

ответ

1

Там еще один способ настроить издевались метод по-разному реагируют на различные входы:

var obj = ""; 

var propertyMock1 = new Mock<PropertyInfo>(); 
var propertyMock2 = new Mock<PropertyInfo>(); 

var result1 = ""; 
var result2 = ""; 

var factoryMock = new Mock<IFactory>(); 
factoryMock.Setup(f => f.Create(It.IsAny<string>(), It.IsAny<PropertyInfo>())).Returns<string, PropertyInfo>((s, pi) => { 
    if (pi == propertyMock1.Object) 
     return result1; 
    if (pi == propertyMock2.Object) 
     return result2; 
}); 

// factoryMock.Setup(f => f.Create(obj, propertyMock2.Object)).Returns(result2); 

Я всегда должен напомнить себе, что есть и другие ароматы Returns, который включает общие типы.

+0

Я получаю исключение, когда я на самом деле вызываю метод Create: 'System.Reflection.TargetParameterCountException: несоответствие счетчика параметров.' – dcastro

+0

Отредактировано для учета первого параметра. –

+0

Это сработало, спасибо! – dcastro

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