当使用模拟的PatIndex对象对SqlFunctions的IQueryable进行单元测试时,我得到以下错误:
“此函数只能从LINQ实体调用。”。
下面是我如何初始化模拟存储库:
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作为模拟框架。
诚挚的问候
丹尼尔
发布于 2015-09-18 11:27:06
使用Microsoft.QualityTools.Testing.Fakes.dll (以下是关于如何使用它的链接:MSDN)
稍后生成用于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
}一旦您为PatIndex提供了一个Shim (您可以调用它作为替换),您将能够成功地对目标方法进行单元测试。
https://stackoverflow.com/questions/32199458
复制相似问题