2016-02-24 7 views
1

Я использую FakeItEasy, чтобы проверить, вызван ли вызов метода публичного setter свойства.Получить метод имя свойства setter в C#

свойство называется Description, и на данный момент я тестирую его так:

A.CallTo(model) 
    .Where(x => x.Method.Name.Equals("set_Description")) 
    .WithAnyArguments() 
    .MustHaveHappened(); 

Это работает функционально, однако недостаток использования волшебной строки для имени метода является то, что если я реорганизовать имя свойства, тест завершится неудачно, и мне придется вручную изменять строки во всех тестах.

В идеале, я хотел бы знать о пути, чтобы сделать это, как и в этой части псевдокода:

var setterName = model.GetType() 
         .SelectProperty(x => x.Description) 
         .GetSetterName(); 

A.CallTo(model) 
    .Where(x => x.Method.Name.Equals(setterName)) 
    .WithAnyArguments() 
    .MustHaveHappened(); 

Таким образом, если я правая кнопка мыши реорганизовать Description свойства, тестам не нужен быть обновленным. Как я могу это сделать?

+0

Как в стороне, вы можете опустить «WithAnyArguments» здесь, если вы так склонны. –

+0

Почему это @BlairConrad? Является ли 'WithAnyArguments' подразумеваемой, если я специально не объявляю ограничения? –

+1

вот почему. Хм. Я не могу здесь @JamesMonger. Кажется, в начале. Ах. Потому что «владелец сообщения всегда будет уведомлен». То, чему вы учитесь. –

ответ

2

Я думаю, что вы можете сделать это с помощью nameof ключевого слова: https://msdn.microsoft.com/en-us/library/dn986596.aspx

Так что я предполагаю, что это будет что-то вроде

.Where(x => x.Method.Name.Equals("set_" + nameof(x.Description)) 
3

Ваш псевдокод был на правильном пути.

var setterName = model.GetType() 
        .GetProperty(nameof(Description)) 
        .GetSetMethod(); 

Обратите внимание, что nameof доступен только в C# 6.

+0

Спасибо за помощь, @Dennis_E. Я выбрал ответ Терье, поскольку он немного более краткий, однако я ценю, что вы нашли время, чтобы ответить. Я также благодарен вам за то, что ваша версия немного более надежна, так как она даже не содержит строку 'set_'. Еще раз спасибо! –

1

Обратите внимание, что по состоянию на FakeItEasy 2.0.0, если сеттер имеет добытчик, а также, вы можете использовать новый A.CallToSet method:

A.CallToSet(() => model.Description).MustHaveHappened();