2013-11-29 3 views
2

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

В системе используется Entity Framework, и один из классов управления данными обрабатывает пользователей, и я пытаюсь выяснить, как протестировать только базовую функцию GetUserByUserNumber. Я могу использовать подделку IPersistenceManager<User> при создании экземпляра класса UserDataManager, а затем вызвать метод GetUserByUserNumber, но утверждение, что было вызвано userPersistenceManager.ReadCustom, всегда терпит неудачу.

Я пробовал называть метод Delete на подделке userPersistenceManager, и утверждение для этого отлично работает. Я думаю, что это имеет какое-то отношение к выражению Linq, которое в качестве первого параметра принимает метод ReadCustom. Я просто не знаю, как это должно быть обработано. Любая помощь с этим будет оценена!

Это метод в UserDataManager, что я пытаюсь тест:

public User GetUserByUserNumber(string userNumber, bool loadRelatedRecords = false) 
{ 
    if (string.IsNullOrWhiteSpace(userNumber)) 
    { 
     throw MyAppExceptions.CreateMyAppFatalException(Constants.ExceptionKeys.Unexpected, new ArgumentNullException("userNumber")); 
    } 
    Logger.Write(string.Format("Executing GetUserByUserNumber with UserNumber {0}.", userNumber), LogCategory.General, TraceEventType.Verbose); 
    return _UserPersistenceManager.ReadCustom(mem => mem.UserNumber == userNumber, EntityConstants.EntityNames.UserDetail); 
} 

Это метод IPersistenceManager, что я хочу, чтобы обеспечить называется:

TEntity ReadCustom(Expression<Func<TEntity, bool>> predicate, string includeEntityName); 

Это мой блок test:

[TestMethod] 
public void GetUserByUserNumber_Calls_ReadCustom() 
{ 
    // Arrange 
    var userPersistenceManager = A.Fake<IPersistenceManager<User>>(); 
    var dataManager = new UserDataManager(userPersistenceManager); 

    // Act 
    dataManager.GetUserByUserNumber("123456", false); 

    // Assert 
    A.CallTo(() => userPersistenceManager.ReadCustom(u => u.UserNumber == "123456", EntityConstants.EntityNames.UserDetail)).MustHaveHappened(); 
} 

ответ

0

Я думаю, что ответ Тима Лонга по сути прав, хотя мой уклон не в том, что это провал издевательских фреймворков - все сводится к тому, насколько легко (вообще говоря, не только издевательски) определить, тоже самое".

Проблема заключается в том, что если не указано иное, FakeItEasy использует .Equals для сравнения аргументов. Expression s плохо сравниваются с .Equals, и поэтому вы получите несоответствие. Один из вариантов - изучить Expression равноправия. Есть еще несколько вопросов о StackOverflow об этом, например, How to check if two Expression<Func<T, bool>> are the same. Если вы можете найти хороший способ определить равенство выражений, я думаю, вы могли бы предоставить этот метод для сопоставления аргументов FakeItEasy
(например, с A<Expression<Func<TEntity, bool>>.That.Matches(…)).

Кроме того, вы можете пройти маршрут г-на Лонга и захватить аргумент, а затем допросить его позже. Я предложил аналогичный подход чуть-чуть назад, отвечая на вопрос How to fake an action<> with FakeItEasy.

В вашем случае вы можете захватить предикат, а затем проверить его правильность, увидев, как он реагирует на различные входные объекты - это похоже на те, что с UserNumber «123456».

1

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

В вашем случае вы по существу сравниваете два выражения для равенства. «Взгляд» различен в коде, хотя они имеют одинаковый синтаксис. Интересно, можете ли вы создать эти два выражения за пределами тестового контекста и посмотреть, сравниваются ли они тогда равными?

Смежные вопросы