Как имитировать свойство, которое возвращает объект списка - 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)

Решение

Спасибо за вашу помощь, после исследования я обнаружил, что создавал новый объект списка внутри презентатора с тем же содержимым объекта списка представлений, и из-за этого он не работал. Теперь я использовал ограничения свойств для соответствия ожидаемым параметрам, и это сработало !! Спасибо всем

Я не вижу нигде, где ваш 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();

если ваше фиктивное свойство должно возвращать одно и то же каждый раз при вызове.