C# 当使用Autofac.Moq检查其他方法时,如何正确模拟方法以返回特定数据?

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

有这样的C代码,并尝试检查方法IsFailureProcessStatus是否返回true。 来自dapper类SqlMapper的查询方法,该类调用带有参数的存储过程

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);