MOQ настройка свойств объекта - PullRequest
2 голосов
/ 08 марта 2020

Мне приходится работать с классом, который имеет неизвестные зависимости и, возможно, пахнет другим кодом.

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

Я создал фабрику, которая создает этот объект и устанавливает свойства.

Я хочу модульные тесты для этой фабрики, и так как для этого объекта неизвестна зависимость, я создаю макет с помощью MOQ.

У меня проблема в том, что я не могу установить свойства для объекта MOQ. Я хочу, чтобы он был установлен на заводе НЕ с помощью

    mock.Setup(x => x.FirstName).Returns(firstName);

Так вот мой демонстрационный код и тесты

    [TestCase("John")]
    [TestCase("Paul")]
    [TestCase("George")]
    [TestCase("Ringo")]
    public void Create(string firstName)
    {
        //arrange
        var mock = new Mock<IPerson>();

        //act
        var actual = PersonFactory.Create(mock.Object, firstName);
        //assert
        Assert.AreEqual(firstName, actual.FirstName);
    }

Завод выглядит так

public static class PersonFactory
{
    public static IPerson Create(IPerson person, string firstName)
    {
        person.FirstName = firstName;
        return person;
    }
}

Я попробовал это с NSubsitute и все заработало нормально. Я подозреваю, что где-то нужен объект.

1 Ответ

1 голос
/ 08 марта 2020

Разрешить макету для записи значений, присвоенных свойствам по вызову

mock.SetupAllProperties(); //Stub all properties on a mock (not available on Silverlight):

Ссылка MOQ Быстрый старт: Свойства

[TestCase("John")]
[TestCase("Paul")]
[TestCase("George")]
[TestCase("Ringo")]
public void Create(string firstName) {
    //arrange
    var mock = new Mock<IPerson>();
    mock.SetupAllProperties();

    //act
    var actual = PersonFactory.Create(mock.Object, firstName);

    //assert
    Assert.AreEqual(firstName, actual.FirstName);
}

Вы также можете проверить свойство установить напрямую

mock.VerifySet(foo => foo.FirstName = firstName);

Например

[TestCase("John")]
[TestCase("Paul")]
[TestCase("George")]
[TestCase("Ringo")]
public void Create(string firstName) {
    //arrange
    var mock = new Mock<IPerson>();

    //act
    var actual = PersonFactory.Create(mock.Object, firstName);

    //assert
    mock.VerifySet(_ => _.FirstName = firstName);   
}
...