Проверьте, что был назван установщик свойства

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

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

1 ответ

Это не тот сценарий, для которого предназначен mocking, потому что вы пытаетесь проверить детали реализации. Теперь, если это свойство было в другом классе, к которому исходный класс обращался через интерфейс, вы бы смоделировали этот интерфейс и установили ожидание с помощью IgnoreArguments синтаксис:

public interface IMyInterface
{
    string MyString { get; set; }
}

public class MyClass
{
    public MyClass(IMyInterface argument)
    {
        argument.MyString = "foo";
    }
}

[TestClass]
public class Tests
{
    [TestMethod]
    public void Test()
    {
        var mock = MockRepository.GenerateMock<IMyInterface>();
        mock.Expect(m => m.MyString = "anything").IgnoreArguments();
        new MyClass(mock);
        mock.VerifyAllExpectations();
    }
}

Есть 2 проблемы с тем, что вы пытаетесь сделать. Во-первых, вы пытаетесь смоделировать конкретный класс, поэтому вы можете устанавливать ожидания только в том случае, если свойства являются виртуальными.

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

Если класс не запечатан, а свойство является виртуальным, вы можете проверить это без насмешек, создав собственный производный класс для тестирования, например:

public class RealClass
{
    public virtual string RealString { get; set; }

    public RealClass()
    {
        RealString = "blah";
    }
}

[TestClass]
public class Tests
{
    private class MockClass : RealClass
    {
        public bool WasStringSet;

        public override string RealString
        {
            set { WasStringSet = true; }
        }
    }

    [TestMethod]
    public void Test()
    {
        MockClass mockClass = new MockClass();
        Assert.IsTrue(mockClass.WasStringSet);
    }
}
Другие вопросы по тегам