2017-01-20 4 views
1

Есть ли способ игнорировать внутренние свойства класса при выполнении ShouldBeEquivalentTo?Игнорировать внутренние свойства в ShouldBeEquivalentTo

Например, в приведенном ниже классе я хочу исключить свойство MetaData из сопоставления графа объекта.

public class SomeObject 
{ 
    Public string SomeString { get; set; } 
    internal MetaData MetaData { get; set; } 
} 

Я предпочел бы не использовать

someObject.ShouldBeEquivalentTo(someOtherObject, options =>  
    options.Excluding(info => info.SelectedMemberPath == "MetaData") 

Потому что я мог бы иметь более 1 внутреннее свойство и настройке это для всех этих свойств было бы утомительно.

ответ

1

Существует интерфейс IMemberSelectionRule в библиотеке FluentAssertions:

Представляет правило, которое определяет, какие член предметной испытуемого включать при сравнении двух объектов для структурного равенства.

Реализация этого интерфейса позволяет исключить все внутренние свойства сразу (где IsAssembly свойство true):

internal class AllExceptNonPublicPropertiesSelectionRule : IMemberSelectionRule 
    { 
    public bool IncludesMembers 
    { 
     get { return false; } 
    } 

    public IEnumerable<SelectedMemberInfo> SelectMembers(
     IEnumerable<SelectedMemberInfo> selectedMembers, 
     ISubjectInfo context, 
     IEquivalencyAssertionOptions config) 
    { 
     return selectedMembers.Except(
     config.GetSubjectType(context) 
      .GetNonPrivateProperties() 
      .Where(p => p.GetMethod.IsAssembly) 
      .Select(SelectedMemberInfo.Create)); 
    } 
    } 

Теперь правило может быть использовано в единичных испытаний:

someObject.ShouldBeEquivalentTo(someOtherObject, options => options.Using(
    new AllExceptNonPublicPropertiesSelectionRule())); 
+0

Отлично работает, спасибо! – Lejdholt