Moq C#MongoDB FindAsync返回值
最近,我们为Mongo实现了一个通用版本的存储库 存储库Moq C#MongoDB FindAsync返回值,c#,mongodb,moq,xunit.net,C#,Mongodb,Moq,Xunit.net,最近,我们为Mongo实现了一个通用版本的存储库 存储库 public async Task<IList<T>> FindAsync<T>(FilterDefinition<T> t) where T : IMongoModel { var collection = _connection.GetCollection<T>(); var result = await collection.FindAsync<T&g
public async Task<IList<T>> FindAsync<T>(FilterDefinition<T> t) where T : IMongoModel
{
var collection = _connection.GetCollection<T>();
var result = await collection.FindAsync<T>(t);
return await result.ToListAsync();
}
public async Task<IList<T>> FindAsync<T>(Expression<Func<T, bool>> filter) where T : IMongoModel
{
var collection = _connection.GetCollection<T>();
var result = await collection.FindAsync(filter);
return await result.ToListAsync();
}
公共异步任务FindAsync(FilterDefinition t),其中t:IMongoModel
{
var collection=_connection.GetCollection();
var result=await collection.FindAsync(t);
返回等待结果。toListSync();
}
公共异步任务FindAsync(表达式筛选器),其中T:IMongoModel
{
var collection=_connection.GetCollection();
var result=await collection.FindAsync(过滤器);
返回等待结果。toListSync();
}
正在调用的代码
private async Task<MongoDb.Advertisement.Service.Models.AdvertisementFiles.Advertisement> DealerZipCodeAndLocation(MongoDb.Advertisement.Service.Models.AdvertisementFiles.Advertisement advertisement, string searchPhone)
{
var matchingDealers = await _mongoRepository.FindAsync(Builders<Dealer>.Filter.ElemMatch(y => y.Phones, z => z.PhoneNumber == searchPhone));
if (!matchingDealers.Any())
{
return advertisement;
}
if (matchingDealers.Count > 1)
{
_logger.Warning("More than one dealer found with {PhoneNumber}", searchPhone);
}
var matchingDealer = matchingDealers.FirstOrDefault();
if (matchingDealer.Geocode == null)
{
var geoCode = await _geoLocationCache.GetGeocodByZipCode(matchingDealer.Address.ZipCode);
if (geoCode.status != "OK")
{
return advertisement;
}
advertisement.Geocode = geoCode;
advertisement.ZipCode = matchingDealer.Address.ZipCode;
await UpdateGeocode<Dealer>(matchingDealer.Id, geoCode);
}
return advertisement;
}
public IList<Dealer> GetDealerWithZipCode()
{
return new List<Dealer>
{
new Dealer
{
Active = true,
DealerName = "City Chevrolet",
Phones = new List<Phone>
{
new Phone
{
PhoneNumber = "4033809999"
}
},
MasterCode = "CHEV01",
RevisionDate = DateTime.UtcNow
}
};
}
public async Task<IList<Dealer>> GetDealerWithZipCode()
{
return await Task.Run(() => new List<Dealer>
{
new Dealer
{
Active = true,
DealerName = "City Chevrolet",
Phones = new List<Phone>
{
new Phone
{
PhoneNumber = "4033809999"
}
},
MasterCode = "CHEV01",
RevisionDate = DateTime.UtcNow
}
});
}
private async Task DealerZipCodeAndLocation(MongoDb.advision.Service.Models.advisementfiles.advision advision,string searchPhone)
{
var matchingderals=wait _mongoRepository.FindAsync(Builders.Filter.ElemMatch(y=>y.Phones,z=>z.PhoneNumber==searchPhone));
如果(!matchingDealers.Any())
{
退货广告;
}
如果(匹配经销商数>1)
{
_logger.Warning(“找到多个具有{PhoneNumber}的经销商”,searchPhone);
}
var matchingDealer=matchingDealers.FirstOrDefault();
if(matchingDealer.Geocode==null)
{
var geoCode=await_geoLocationCache.GetGeocodByZipCode(matchingDealer.Address.ZipCode);
如果(geoCode.status!=“正常”)
{
退货广告;
}
广告。地理编码=地理编码;
advision.ZipCode=matchingDealer.Address.ZipCode;
等待更新代码(matchingDealer.Id,地理代码);
}
退货广告;
}
还尝试了以下签名
var matchingDealers = await _mongoRepository.FindAsync<Dealer>(x => x.Phones.Any(y => y.PhoneNumber == searchPhone));
var matchingDealers = await _mongoRepository.FindAsync(filter);
var matchingderals=wait _mongoRepository.FindAsync(x=>x.Phones.Any(y=>y.PhoneNumber==searchPhone));
var matchingDealers=Wait _mongoRepository.FindAsync(过滤器);
当模拟FindAsync调用时,我在返回时遇到了困难。问题要么是签名不匹配,要么更可能是异步
最小起订量设置
我已经尝试了这两个版本(也用It.IsAny()
代替电话号码)
\u testFixture.MongoRepository.Setup(x=>x.FindAsync(Builders.Filter.ElemMatch(y=>y.Phones,z=>z.PhoneNumber==\u testFixture.GetAdvertisementWithNoZipCode().OriginalPhoneNumber))。返回(Task.FromResult(\u testFixture.getDealWithzipcode());
_testFixture.MongoRepository.Setup(x=>x.FindAsync(Builders.Filter.ElemMatch(y=>y.Phones,z=>z.PhoneNumber==_testFixture.GetAdvertisementWithNoZipCode().OriginalPhoneNumber)).ReturnsAsync(_testFixture.getDealWithzipcode());
返回已尝试的对象
private async Task<MongoDb.Advertisement.Service.Models.AdvertisementFiles.Advertisement> DealerZipCodeAndLocation(MongoDb.Advertisement.Service.Models.AdvertisementFiles.Advertisement advertisement, string searchPhone)
{
var matchingDealers = await _mongoRepository.FindAsync(Builders<Dealer>.Filter.ElemMatch(y => y.Phones, z => z.PhoneNumber == searchPhone));
if (!matchingDealers.Any())
{
return advertisement;
}
if (matchingDealers.Count > 1)
{
_logger.Warning("More than one dealer found with {PhoneNumber}", searchPhone);
}
var matchingDealer = matchingDealers.FirstOrDefault();
if (matchingDealer.Geocode == null)
{
var geoCode = await _geoLocationCache.GetGeocodByZipCode(matchingDealer.Address.ZipCode);
if (geoCode.status != "OK")
{
return advertisement;
}
advertisement.Geocode = geoCode;
advertisement.ZipCode = matchingDealer.Address.ZipCode;
await UpdateGeocode<Dealer>(matchingDealer.Id, geoCode);
}
return advertisement;
}
public IList<Dealer> GetDealerWithZipCode()
{
return new List<Dealer>
{
new Dealer
{
Active = true,
DealerName = "City Chevrolet",
Phones = new List<Phone>
{
new Phone
{
PhoneNumber = "4033809999"
}
},
MasterCode = "CHEV01",
RevisionDate = DateTime.UtcNow
}
};
}
public async Task<IList<Dealer>> GetDealerWithZipCode()
{
return await Task.Run(() => new List<Dealer>
{
new Dealer
{
Active = true,
DealerName = "City Chevrolet",
Phones = new List<Phone>
{
new Phone
{
PhoneNumber = "4033809999"
}
},
MasterCode = "CHEV01",
RevisionDate = DateTime.UtcNow
}
});
}
public IList GetDealerWithZipCode()
{
返回新列表
{
新经销商
{
活动=真,
DealerName=“城市雪佛兰”,
电话=新列表
{
新电话
{
电话号码=“4033809999”
}
},
MasterCode=“CHEV01”,
修订日期=DateTime.UtcNow
}
};
}
公共异步任务getDealWithZipCode()
{
返回等待任务。运行(()=>新建列表
{
新经销商
{
活动=真,
DealerName=“城市雪佛兰”,
电话=新列表
{
新电话
{
电话号码=“4033809999”
}
},
MasterCode=“CHEV01”,
修订日期=DateTime.UtcNow
}
});
}
例外情况
System.ArgumentNullException: Value cannot be null.
Parameter name: source
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at Domain.Advertisement.Service.BackgroundProcessors.ZipCodeAndLocationProcessor.<DealerZipCodeAndLocation>d__5.MoveNext() in C:\Repos\Vader\AdSvc\domain\domain.advertisement.service\BackgroundProcessors\ZipCodeAndLocationProcessor.cs:line 60
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Domain.Advertisement.Service.BackgroundProcessors.ZipCodeAndLocationProcessor.<ProcessVehicleAdvertisementLocation>d__4.MoveNext() in C:\Repos\Vader\AdSvc\domain\domain.advertisement.service\BackgroundProcessors\ZipCodeAndLocationProcessor.cs:line 42
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Domain.Advertisement.Service.Tests.Processors.ZipCodeAndLocation.ZipCodeAndLocationProcessorFacts.<ProcessVehicleAdvertisementLocation_AdLineHasEmptyZipCodePhoneMatchesDealer_GeocodeIsAddedToAdvertisement>d__3.MoveNext() in C:\Repos\Vader\AdSvc\tests\domain.advertisement.service.tests\Processors\ZipCodeAndLocation\ZipCodeAndLocationProcessorFacts.cs:line 47
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.TestInvoker`1.<>c__DisplayClass48_1.<<InvokeTestMethodAsync>b__1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.ExecutionTimer.<AggregateAsync>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.ExceptionAggregator.<RunAsync>d__9.MoveNext()
System.ArgumentNullException:值不能为null。
参数名称:源
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
位于C:\Repos\Vader\AdSvc\Domain\Domain.advision.Service.BackgroundProcessors.ZipCodeAndLocationProcessor.d_u5.MoveNext()中的Domain.advision.Service\BackgroundProcessors\ZipCodeAndLocationProcessor.cs:第60行
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
位于C:\Repos\Vader\AdSvc\Domain\Domain.advision.Service.BackgroundProcessors.ZipCodeAndLocationProcessor.d_u4.MoveNext()中的Domain.advision.Service\BackgroundProcessors\ZipCodeAndLocationProcessor.cs:第42行
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
位于C:\Repos\Vader\AdSvc\Tests\Domain.advision.Service.Tests\Processors.ZipCodeAndLocation\ZipCodeAndLocationProcessorFacts.d_u3.MoveNext()中的Domain.advision.Service.Tests\Processors\ZipCodeAndLocation\ZipCodeAndLocation\ZipCodeAndLocationProcessorFacts.cs:第47行
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在Xunit.Sdk.TestInvoker`1.c_uudisplayClass48_1.d.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在Xunit.Sdk.ExecutionTimer.d_u4.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
Task<IList<T>> FindAsync<T>(FilterDefinition<T> t) where T : IMongoModel
if (matchingDealer.Geocode == null) {
//...