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, вы сможете успешно протестировать свой целевой метод.