Как смоделировать свойство, которое возвращает объект списка - In rhino mock - PullRequest
4 голосов
/ 26 февраля 2009
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;

Когда я использую приведенный выше код для возврата фиктивного списка имен, он не совпадает с предположением, затем возвращает ноль и завершается ошибкой

спасибо за вашу помощь

Edit: Я передаю представление в качестве параметра в метод GetNames докладчика. Вот проблема, когда я возвращаю объект списка из свойства mocked, он возвращает ноль. Однако когда я изменяю тип данных свойства на тип string / int i.e.premitive, тогда значение возвращается правильно

Ответы [ 4 ]

3 голосов
/ 27 февраля 2009

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

Я могу только предположить, что вы делаете что-то не так с тем, как вы перепутали код.

1 голос
/ 02 марта 2009

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

0 голосов
/ 09 марта 2009

Одна вещь, которую вы не должны забывать (я знаю, что сделал, и это сбило меня с толку): укажите, сколько раз вы хотите, чтобы ожидание сработало - иначе, если ваш код использует свойство более одного раза, получит странные результаты, так как ожидание

mockView.Expect(v => v.Names).Return(names);

работает только для одного звонка. Поэтому вы должны написать

mockView.Expect(v => v.Names).Return(names).Repeat.Any();

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

0 голосов
/ 27 февраля 2009

Я не знаком с Rhino Mocks, но я могу рассказать вам, как это сделать с помощью встроенной библиотеки NUnit, NUnit.Mocks:

Имена списков = новый список {"Test", "Test1"};

DynamicMock mockView = новый DynamicMock (typeof (IView));

mockView.ExpectAndReturn ("get_Names", names);

IView view = (IView) mockView.MockInstance;

Assert.AreEqual (имена, Presenter.GetNames (просмотреть));

...