C# 如何为服务类创建单元测试?
我有以下服务类别代码:C# 如何为服务类创建单元测试?,c#,unit-testing,moq,C#,Unit Testing,Moq,我有以下服务类别代码: public class StaySearchManager { private readonly IPriceGridRepo _priceGridRepo; public StaySearchManager(IPriceGridRepo priceGridRepo) { _priceGridRepo = priceGridRepo; } public async Task<IEnumerable<
public class StaySearchManager
{
private readonly IPriceGridRepo _priceGridRepo;
public StaySearchManager(IPriceGridRepo priceGridRepo)
{
_priceGridRepo = priceGridRepo;
}
public async Task<IEnumerable<StaySearchResult>> Search(StaySearchParameter searchParameter)
{
if (!searchParameter.RoomIds.Any())
return new StaySearchResult[0];
PriceGrids[] grids = await _priceGridRepo.GetRoomPriceGrid(searchParameter.RoomIds);
return grids.Select(g => g.TryCreateStay(searchParameter)).Where(s => s != null).ToList();
}
}
公共类StaySearchManager
{
私有只读IPriceGridRepo(priceGridRepo);
公共部门主管(IPriceGridRepo priceGridRepo)
{
_priceGridRepo=priceGridRepo;
}
公共异步任务搜索(StaySearchParameter searchParameter)
{
如果(!searchParameter.RoomIds.Any())
返回新的StatySearchResult[0];
PriceGrids[]grids=wait\u priceGridRepo.GetRoomPriceGrid(searchParameter.RoomIds);
返回grids.Select(g=>g.TryCreateStay(searchParameter)).Where(s=>s!=null.ToList();
}
}
我能够创建单元测试(使用moq)来检查:
-如果没有房间ID,我们将返回一个空结果
-如果有一些房间ID,我们将使用good参数调用repo
但是,我如何对stay创建过程进行单元测试呢
第一种解决方案是创建一个IPriceGrid itnerface,然后对其进行模拟,但这似乎是一种过度工程,因为该接口仅用于单元测试
第二个解决方案是进行交互测试,但它将是我在PriceGrid上的单元测试的副本
有第三种解决方案吗?您不能断言
Search
方法的返回结果吗?如果我正确理解了这个问题。@user3185569是的,我可以,因为通过mockRepo,我可以返回我想要的网格(因此可以推断停留时间/价格),这是第二个解决方案:我的所有测试都将与网格的单元测试相同。您需要远离微测试(测试每个类)并习惯于功能测试(测试多个类之间的协作)。当您测试StaySearchManager
时,您是在间接测试PriceGrids。(如果您仍然对所有代码执行路径具有100%的覆盖率,则这一点适用)您的PriceGrid
类似乎违反了SRP原则,并将您困在其中dilemma@SirRufo只有一种基于两个日期计算价格的方法,你能在这里发布一个更详细的答案吗?我应该创建一个昂贵的服务吗?但我认为最终我会有一个贫乏的领域模型