Проверьте, что был назван установщик свойства
У меня есть класс, который я тестирую, и все, что я хочу сделать, это проверить, что общедоступный установщик вызывается для свойства. Есть идеи, как это сделать?
Я не хочу проверять, что значение было установлено, чтобы доказать, что оно было вызвано. Я только хочу убедиться, что конструктор использует открытый сеттер. Обратите внимание, что этот тип данных свойства является примитивной строкой
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);
}
}