UnitTesting PatIndex

При модульном тестировании PatIndex для SqlFunctions с помощью фиктивного объекта IQueryable я получаю следующую ошибку:

"Эту функцию можно вызвать только из LINQ to Entities".

Вот как я инициализирую свои ложные репозитории:

protected void InitUnitOfWork<TEntity>(IEnumerable<TEntity> data)
    where TEntity : class
{
    var dataSet = Substitute.For<IDbSet<TEntity>, IQueryable<TEntity>>().Initialize(data.AsQueryable());
    var query = Substitute.For<IRepositoryQuery<TEntity>>();
    var repository = Substitute.For<IRepository<TEntity>>();

    this.UnitOfWork.Repository<TEntity>().Returns(repository);
    repository.Query().Returns(query);
    query.Include(null).ReturnsForAnyArgs(query);
    query.Filter(null).ReturnsForAnyArgs(query);
    query.Get().Returns(dataSet);
}

Это метод, который я пытаюсь проверить:

public IEnumerable<ContactDto> GetContactsBySearchText(string searchText)
{
    var companyId = CurrentUser.User.CurrentCompany.Id;

    var contacts = this.GetIQueryableContacts().Where(x => x.CompanyMasterData.Id == companyId);

    if (!string.IsNullOrWhiteSpace(searchText))
    {
        var pattern = SearchQueryParserHelper.ParseString(searchText.Trim());
        contacts = contacts.Where(x => SqlFunctions.PatIndex(pattern, x.Name) > 0
            || SqlFunctions.PatIndex(pattern, x.Code) > 0
            || SqlFunctions.PatIndex(pattern, x.Phone) > 0);
    }

    return Mapper.Map<IQueryable<Contact>, IEnumerable<ContactDto>>(contacts);
}

Я знаю, что могу решить эту проблему с помощью базы данных, но как я могу правильно ее издеваться?

Я использую NSubstitute в качестве Mocking Framework.

С наилучшими пожеланиями

Даниил

1 ответ

Использовать Microsoft.QualityTools.Testing.Fakes.dll (Вот ссылка о том, как его использовать: MSDN)

Позже сгенерируйте сборку Fakes для System.Data.Entity.SqlServer.dll

Оберните тело вашего метода юнит-теста следующим using заявление:

using (Microsoft.QualityTools.Testing.Fakes.ShimsContext.Create())
{
     // Setup Shim function for PatIndex:
     System.Data.Entity.SqlServer.FakesShimSqlFunctions.PatIndexStringString = (pattern, target) => 
     {
        // Implement PatIndex function here
        throw new NotImplementedException();
     }

     // Your Unit test code goes here
}

После того, как вы предоставили Shim (вы можете назвать его заменой) для PatIndex, вы сможете успешно протестировать свой целевой метод.

Другие вопросы по тегам