C# 在存储库模式中测试SQL过程调用

C# 在存储库模式中测试SQL过程调用,c#,unit-testing,repository,moq,C#,Unit Testing,Repository,Moq,你能告诉我如何为这个类编写单元测试/创建模拟吗 public class LoadRepository :Repository<Load, LoadModel>,ILoadRepository { IUSCanadaCityStateRepository _USCanadaCityStateRepository; public LoadRepository(DbContext dbContext, IUSCanadaCityStateRepository USCa

你能告诉我如何为这个类编写单元测试/创建模拟吗

public class LoadRepository :Repository<Load, LoadModel>,ILoadRepository
 {
    IUSCanadaCityStateRepository _USCanadaCityStateRepository;
    public LoadRepository(DbContext dbContext, IUSCanadaCityStateRepository  USCanadaCityStateRepository) : base(dbContext)
    {
        _USCanadaCityStateRepository = USCanadaCityStateRepository;
    }        
    public int GetPickUpLocations(int loadId)
    {
        var count = _dbSet.FromSql("SELECT COUNT(LocationID) as locationCount FROM vPickupLoc WHERE vPickupLoc.LoadID = @p0", loadId).ToArray();
        return count[0].LoadLocations.Count;
    }


    public LoadCarrierInfo UpdateCarrierInfo(LoadCarrierInfo loadCarrierInfo)
    {

        return _dbSet.FromSql("UpdatePickCarrier @CarrierID,@LoadID, @Primary,@AssistingPortalID,@AssistingEmployeeID",
                    new SqlParameter("LoadID", SqlDbType.Int) { Value = loadCarrierInfo.LoadId },
                    new SqlParameter("Dispatcher", SqlDbType.VarChar) { Value = loadCarrierInfo.Dispatcher },
                    new SqlParameter("EmployeeID", SqlDbType.Int) { Value = 1 }, // logged in Employee instead
                    new SqlParameter("AssistingPortalID", SqlDbType.Int) { Value = loadCarrierInfo.AssistingPortalId },
                    new SqlParameter("AssistingEmployeeID", SqlDbType.VarChar) { Value = loadCarrierInfo.AssistingEmployeeId })
                    .Select(x=>new LoadCarrierInfo { }).FirstOrDefault();
    }

}
public类LoadRepository:Repository,ILoadRepository
{
IUSCanadaCityStateRepository USCanadaCityStateRepository;
公共加载存储库(DbContext DbContext,IUSCanadaCityStateRepository USCanadaCityStateRepository):基础(DbContext)
{
_USCanadaCityStateRepository=USCanadaCityStateRepository;
}        
公共int GetPickUpLocations(int loadId)
{
var count=_dbSet.FromSql(“选择count(LocationID)作为来自vPickupLoc的locationCount,其中vPickupLoc.LoadID=@p0”,LoadID.ToArray();
返回计数[0]。LoadLocations.count;
}
公共LoadCarrierInfo更新CarrierInfo(LoadCarrierInfo LoadCarrierInfo)
{
返回_dbSet.FromSql(“updateEpicCarrier@CarrierID、@LoadID、@Primary、@AssistingPortalID、@AssistingEmployeeID”,
新的SqlParameter(“LoadID”,SqlDbType.Int){Value=loadCarrierInfo.LoadID},
新的SqlParameter(“Dispatcher”,SqlDbType.VarChar){Value=loadCarrierInfo.Dispatcher},
新的SqlParameter(“EmployeeID”,SqlDbType.Int){Value=1},//改为登录Employee
新的SqlParameter(“AssistingPortalID”,SqlDbType.Int){Value=loadCarrierInfo.AssistingPortalID},
新的SqlParameter(“AssistingEmployeeID”,SqlDbType.VarChar){Value=loadCarrierInfo.AssistingEmployeeID})
.Select(x=>newloadcarrienfo{}).FirstOrDefault();
}
}
不幸的是,所有的方法都是以这种方式编写的,我不确定有多少是可测试的


非常感谢

您可以使用类似的模拟框架。这样用,

var loadRepo = Substitute.For<ILoadRepository>();
var returnValue = new LoadCarrierInfo();
loadRepo.UpdateCarrierInfo(Arg.Any<LoadCarrierInfo>).Returns(returnValue );
var loadRepo=Substitute.For();
然后,您可以将模拟注入iLocatory的使用者。然后你可以模仿这样的方法

var loadRepo = Substitute.For<ILoadRepository>();
var returnValue = new LoadCarrierInfo();
loadRepo.UpdateCarrierInfo(Arg.Any<LoadCarrierInfo>).Returns(returnValue );
var returnValue=new LoadCarrierInfo();
loadRepo.UpdateCarrierInfo(Arg.Any).Returns(returnValue);
这将返回带有任何参数的
updatecarrienfo
方法调用的
returnValue
对象


的文档中提供了更多选项

单元测试的重点不是针对数据库进行测试,而是针对代码的逻辑进行测试。当您将数据库内容放入单元测试时,它不再是单元测试,而是集成测试。您能否澄清一下,您是要模拟还是要测试SQL过程?这些是相互排斥的。假设方法来自
ILoadRepository
而不是
Repository
,那么模拟应该很容易。如果可能的话,我想模拟ILoadRepository-但是,不运行过程