C# 当使用Autofac.Moq检查其他方法时,如何正确模拟方法以返回特定数据?
有这样的C代码,并尝试检查方法IsFailureProcessStatus是否返回true。 来自dapper类SqlMapper的查询方法,该类调用带有参数的存储过程C# 当使用Autofac.Moq检查其他方法时,如何正确模拟方法以返回特定数据?,c#,unit-testing,moq,autofac,dapper,C#,Unit Testing,Moq,Autofac,Dapper,有这样的C代码,并尝试检查方法IsFailureProcessStatus是否返回true。 来自dapper类SqlMapper的查询方法,该类调用带有参数的存储过程 public class DatabaseManager : IDatabaseManager { private readonly SqlConnection CoreDbProcessesConnection; private readonly SqlConnection HrReportDb
public class DatabaseManager : IDatabaseManager
{
private readonly SqlConnection CoreDbProcessesConnection;
private readonly SqlConnection HrReportDbConnection;
// there are other private fields with parameters and sql-procedures names
public DatabaseManager(IDbConnectionsProvider dbConnectionsProvider)
{
this.CoreDbProcessesConnection = dbConnectionsProvider.CoreDbProcessesConnection;
this.HrReportDbConnection = dbConnectionsProvider.HrReportDbConnection;
}
public List<CoreProcessStatusDto> GetProcessStatusIds(string ProcessName, DateTime dateTime)
{
var parameters = new DynamicParameters();
parameters.Add(processStatusProcedureParamName01, ProcessName);
parameters.Add(processStatusProcedureParamName02, dateTime);
var output = this.CoreDbProcessesConnection
.Query<CoreProcessStatusDto>(ProcessStatusProcedureName, parameters, commandType: CommandType.StoredProcedure).ToList();
return output;
}
public bool IsFailureProcessStatus(StepDto.StepDescription step, DateTime dateTime)
{
bool isStepFailure = true;
Stopwatch doStepUntil = new Stopwatch();
doStepUntil.Start();
while (doStepUntil.Elapsed < TimeSpan.FromSeconds(step.SecondsElapsed))
{
step.StatusTypesList = this.GetProcessStatusIds(step.ProcessName, dateTime);
var statusTypesStepSelection = step.StatusTypesList.Select(st => st.ProcessStatusTypeId).ToList();
//...
// if...else operations here to make step true or false
//...
}
doStepUntil.Stop();
return isStepFailure;
}
}
公共类数据库管理器:IDatabaseManager
{
私有只读SqlConnection CoredProcessConnection;
私有只读SqlConnection HrReportDbConnection;
//还有其他带有参数和sql过程名称的私有字段
公共数据库管理器(IDbConnectionsProvider dbConnectionsProvider)
{
this.coredbProcessConnection=dbConnectionsProvider.coredbProcessConnection;
this.HrReportDbConnection=dbConnectionsProvider.HrReportDbConnection;
}
公共列表GetProcessStatusID(字符串ProcessName、DateTime DateTime)
{
var参数=新的DynamicParameters();
添加(processStatusProcedureParamName01,ProcessName);
添加(processStatusProcedureParamName02,dateTime);
var output=this.coredbProcessConnection
.Query(ProcessStatusProcedureName,参数,commandType:commandType.StoredProcedure).ToList();
返回输出;
}
public bool IsFailureProcessStatus(StepDto.stepsdescription步骤,DateTime DateTime)
{
bool-isStepFailure=true;
秒表dosteptuntil=新秒表();
doStepUntil.Start();
while(doStepUntil.appeatedst.ProcessStatusTypeId.ToList();
//...
//if…else操作在此处使步骤为真或假
//...
}
dostepintil.Stop();
返回失败;
}
}
单元测试代码位于下面:
[TestClass]
public class DatabaseManagerTests
{
[TestMethod]
public void IsFailureProcessStatus_ReturnTrue()
{
DateTime dateTime = DateTime.Now;
StepDto step1Dto = new StepDto()
{
JobName = "ETL - HR - FilesImport - Reporting",
JobStepName = "RunMCP_User_Department_Map",
Step = new StepDto.StepDescription()
{
StatusTypesList = new List<CoreProcessStatusDto>(),
ProcessName = "HR_User_Department_Map_Import",
SecondsElapsed = 30,
PackageCount = 2
}
};
using (var mock = AutoMock.GetLoose())
{
var dbProviderMock = new Mock<IDbConnectionsProvider>(MockBehavior.Loose);
var dbMock = new Mock<DatabaseManager>(dbProviderMock.Object);
mock.Mock<IDatabaseManager>()
.Setup(p => p.GetProcessStatusIds(step1Dto.Step.ProcessName, dateTime))
.Returns(GetCoreProcessesStatusIdsTest());
var sut = mock.Provide(dbMock.Object);
//var sut = mock.Create<DatabaseManager>();
var actual = sut.IsFailureProcessStatus(step1Dto.Step, dateTime);
Assert.IsTrue(actual);
}
}
private List<CoreProcessStatusDto> GetCoreProcessesStatusIdsTest()
{
var output = new List<CoreProcessStatusDto>()
{
new CoreProcessStatusDto() { ProcessStatusTypeId = 3 },
new CoreProcessStatusDto() { ProcessStatusTypeId = 2 }
};
return output;
}
}
[TestClass]
公共类数据库管理器测试
{
[测试方法]
public void IsFailureProcessStatus_ReturnTrue()
{
DateTime DateTime=DateTime.Now;
StepDto step1Dto=新的StepDto()
{
JobName=“ETL-HR-filesimort-Reporting”,
JobStepName=“RunMCP\u用户\u部门\u地图”,
步骤=新步骤到。步骤描述()
{
StatusTypesList=新列表(),
ProcessName=“HR\U用户\U部门\U地图\U导入”,
第二个selapsed=30,
包装计数=2
}
};
使用(var mock=AutoMock.GetLoose())
{
var dbProviderMock=新模拟(MockBehavior.Loose);
var dbMock=new Mock(dbProviderMock.Object);
mock.mock()
.Setup(p=>p.getProcessStatusID(step1Dto.Step.ProcessName,dateTime))
.Returns(getCoreProcessStatusedTest());
var sut=mock.Provide(dbMock.Object);
//var sut=mock.Create();
var actual=sut.IsFailureProcessStatus(step1Dto.Step,dateTime);
断言.IsTrue(实际);
}
}
私有列表GetCoreProcessStatusedTest()
{
var输出=新列表()
{
新的CoreProcessStatusDto(){ProcessStatusTypeId=3},
新建CoreProcessStatusDto(){ProcessStatusTypeId=2}
};
返回输出;
}
}
我试图在调用sut.IsFailureProcessStatus代码时设置GetProcessStatusIds方法以返回值,但在调试其时,尝试调用查询方法时运行GetProcessStatusIds并引发NullReferenceException异常
Test Name: IsFailureProcessStatus_ReturnTrue
Test Outcome: Failed
Result StackTrace:
at Dapper.SqlMapper.<QueryImpl>d__140`1.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.cs:line 1066
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 721
at ATP.HR.FolderWatcher.Service.Managers.DatabaseManager.GetProcessStatusIds(String ProcessName, DateTime dateTime) in C:\HOME\anatolii.dmitryv\src\HRM\hr-folder-watcher-service\ATP.HR.FolderWatcher.Service\Managers\DatabaseManager.cs:line 46
at ATP.HR.FolderWatcher.Service.Managers.DatabaseManager.IsFailureProcessStatus(StepDescription step, DateTime dateTime) in C:\HOME\anatolii.dmitryv\src\HRM\hr-folder-watcher-service\ATP.HR.FolderWatcher.Service\Managers\DatabaseManager.cs:line 83
at ATP.HR.FolderWatcher.Service.Test.DatabaseManagerTests.IsFailureProcessStatus_ReturnTrue() in C:\HOME\anatolii.dmitryv\src\HRM\hr-folder-watcher-service\ATP.HR.FolderWatcher.Service.Tests\DatabaseManagerTests.cs:line 57
Result Message:
Test method ATP.HR.FolderWatcher.Service.Test.DatabaseManagerTests.IsFailureProcessStatus_ReturnTrue threw exception:
System.NullReferenceException: Object reference not set to an instance of an object.
测试名称:IsFailureProcessStatus\u ReturnTrue
测试结果:失败
结果跟踪:
在C:\projects\Dapper\Dapper\SqlMapper.cs中的Dapper.SqlMapper.d_u140`1.MoveNext()处:第1066行
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
在C:\projects\Dapper\Dapper\SqlMapper.cs中的Dapper.SqlMapper.Query[T](IDbConnection cnn,String sql,Object param,IDbTransaction transaction,Boolean buffered,Nullable`1 commandTimeout,Nullable`1 commandType):第721行
在C:\HOME\anatolii.dmitryv\src\HRM\HR FolderWatcher Service\ATP.HR.FolderWatcher.Service.Managers.DatabaseManager.getProcessStatusID(字符串ProcessName,DateTime DateTime)中的ATP.HR.FolderWatcher.Service\Managers\DatabaseManager.cs:46行
在C:\HOME\anatolii.dmitryv\src\HRM\HR FolderWatcher服务\ATP.HR.FolderWatcher.Service\Managers.DatabaseManager.IsFailureProcessStatus(步骤描述步骤,日期时间日期时间)中的ATP.HR.FolderWatcher.Service\Managers\DatabaseManager.cs:第83行
在C:\HOME\anatolii.dmitryv\src\HRM\HR FolderWatcher Service\ATP.HR.FolderWatcher.Service.Test.DatabaseManagerTests.IsFailureProcessStatus\u ReturnTrue()中的ATP.HR.FolderWatcher.Service.Tests\DatabaseManagerTests.cs:第57行
结果消息:
测试方法ATP.HR.FolderWatcher.Service.Test.DatabaseManagerTests.IsFailureProcessStatus\u ReturnTrue引发异常:
System.NullReferenceException:对象引用未设置为对象的实例。
我在模仿这种方法时到底做错了什么?我怎么能说测试不运行这个getProcessStatusID,只返回硬编码的值呢
尝试使用此选项,但对我无效:
using (var mock = AutoMock.GetLoose())
{
mock.Mock<IDatabaseManager>()
.Setup(p => p.GetProcessStatusIds(It.IsAny<string>(), It.IsAny<DateTime>()))
.Returns(GetCoreProcessesStatusIdsTest());
var sut = mock.Create<DatabaseManager>();
var actual = sut.IsFailureProcessStatus(step1Dto.Step, dateTime);
Assert.IsTrue(actual);
}
使用(var mock=AutoMock.GetLoose())
{
mock.mock()
.Setup(p=>p.getProcessStatusID(It.IsAny(),It.IsAny())
.Returns(getCoreProcessStatusedTest());
var sut=mock.Create();
var actual=sut.IsFailureProcessStatus(step1Dto.Step,dateTime);
断言.IsTrue(实际);
}
var dbProviderMock = new Mock<IDbConnectionsProvider>(MockBehavior.Loose);
dbProviderMock
.Setup(p => p.CoreDbProcessesConnection)
.Returns(new SqlConnection(...));
DatabaseManager databaseManager = new DatabaseManager(dbProviderMock.Object);
var actual = databaseManager.IsFailureProcessStatus(step1Dto.Step, dateTime);
Assert.IsTrue(actual);