Как имитировать свойство, которое возвращает объект списка - In rhino mock
Interface IView
{
List<string> Names {get; set;}
}
public class Presenter
{
public List<string> GetNames(IView view)
{
return view.Names;
}
}
var mockView = MockRepository.GenerateMock<IView>();
var presenter = new Presenter();
var names = new List<string> {"Test", "Test1"};
mockView.Expect(v => v.Names).Return(names);
Assert.AreEqual(names, presenter.GetNames(mockView)) // Here presenter returns null which is incorrect behaviour in my case;
Когда я использую приведенный выше код для возврата фиктивного списка имен, он не соответствует ожидаемому, затем возвращает ноль и терпит неудачу.
Спасибо за вашу помощь
Изменить: я передаю представление в качестве параметра методу ведущего GetNames. Здесь проблема заключается в том, что когда я возвращаю объект списка из имитируемого свойства, он возвращает значение null. Однако, когда я меняю тип данных свойства на тип string / int iepremitive, значение возвращается правильно.
Ответов (4)4
Спасибо за вашу помощь, после исследования я обнаружил, что создавал новый объект списка внутри презентатора с тем же содержимым объекта списка представлений, и из-за этого он не работал. Теперь я использовал ограничения свойств для соответствия ожидаемым параметрам, и это сработало !! Спасибо всем
Я не вижу нигде, где ваш mockView привязывается к вашему докладчику. Таким образом, с точки зрения ведущего, представление является нулевым. Возможно, вам придется сделать что-то вроде:
presenter.View = view;
Я просто закодировал это с помощью NUnit и RhinoMocks 3.5, чтобы убедиться, что он работает. Вот два моих файла классов. Тест пройден.
using System.Collections.Generic;
namespace Tests
{
public interface IView
{
List<string> Names { get; set; }
}
public class Presenter
{
public List<string> GetNames(IView view)
{
return view.Names;
}
}
}
using System.Collections.Generic;
using NUnit.Framework;
using Rhino.Mocks;
namespace Tests
{
[TestFixture]
public class TestFixture
{
[Test]
public void TestForStackOverflow()
{
var mockView = MockRepository.GenerateMock<IView>();
var presenter = new Presenter();
var names = new List<string> {"Test", "Test1"};
mockView.Expect(v => v.Names).Return(names);
Assert.AreEqual(names, presenter.GetNames(mockView));
}
}
}
Я могу только догадываться, что вы делаете что-то не так с тем, как вы перепутали свой код.
Я не знаком с Rhino Mocks, но могу рассказать вам, как это сделать с помощью встроенной библиотеки макетов NUnit, NUnit.Mocks:
Имена списков = новый список {"Тест", "Тест1"};
DynamicMock mockView = новый DynamicMock (typeof (IView));
mockView.ExpectAndReturn ("get_Names", имена);
IView view = (IView) mockView.MockInstance;
Assert.AreEqual (имена, presenter.GetNames (просмотр));
Одна вещь, которую вы не должны забывать (я знаю, что сделал, и это меня запутало): укажите, сколько раз вы хотите, чтобы ожидание сработало - иначе, если ваш код использует свойство более одного раза, вы получите странные результаты, так как ожидание
mockView.Expect(v => v.Names).Return(names);
работает только для разового звонка. Итак, вы должны написать
mockView.Expect(v => v.Names).Return(names).Repeat.Any();
если ваше фиктивное свойство должно возвращать одно и то же каждый раз при вызове.