C# 为什么单元测试在调试迁移到数据访问层时仍然没有被模仿 var ClosedLoopTrxSyncDAL=new Mock(); Mock appSettings=new Mock(); var dt=新数据表(); var isValid=true; DeviceTrxSyncTracking transactionItems=新设备TrxSyncTracking() List ClosedLoopTrxList=新列表(); ClosedLoopTrxSyncDAL.Setup(post=>post.InsertTransaction(dt,transactionItems)).Returns(isValid); var控制器=新的ClosedLoopSyncController(appSettings.Object); SyncDataAnchor结果=controller.ClosedLoopSyncService(ClosedLoopTrxList);

C# 为什么单元测试在调试迁移到数据访问层时仍然没有被模仿 var ClosedLoopTrxSyncDAL=new Mock(); Mock appSettings=new Mock(); var dt=新数据表(); var isValid=true; DeviceTrxSyncTracking transactionItems=新设备TrxSyncTracking() List ClosedLoopTrxList=新列表(); ClosedLoopTrxSyncDAL.Setup(post=>post.InsertTransaction(dt,transactionItems)).Returns(isValid); var控制器=新的ClosedLoopSyncController(appSettings.Object); SyncDataAnchor结果=controller.ClosedLoopSyncService(ClosedLoopTrxList);,c#,unit-testing,moq,C#,Unit Testing,Moq,在这里,调试器移动到数据访问层,即使在模拟它并返回我自己的对象之后也是如此。预期:当我调试测试时,它不应该从业务层移动到数据访问层,而应该返回一个现成的对象当有东西试图访问设置时,您需要告诉模拟对象返回什么。例如,如果您的AppSettings类如下所示: var ClosedLoopTrxSyncDAL = new Mock<ITrxSyncDAL<DeviceTrxSyncTracking>>(); Mock<IOptions<AppSettings&g

在这里,调试器移动到数据访问层,即使在模拟它并返回我自己的对象之后也是如此。预期:当我调试测试时,它不应该从业务层移动到数据访问层,而应该返回一个现成的对象

当有东西试图访问设置时,您需要告诉模拟对象返回什么。例如,如果您的
AppSettings
类如下所示:

var ClosedLoopTrxSyncDAL = new Mock<ITrxSyncDAL<DeviceTrxSyncTracking>>();
 Mock<IOptions<AppSettings>> appSettings = new Mock<IOptions<AppSettings>>();
 var dt = new DataTable();

 var isValid = true;
DeviceTrxSyncTracking transactionItems = new DeviceTrxSyncTracking()
List<ClosedLoopTrxItem> ClosedLoopTrxList = new List<ClosedLoopTrxItem>();   
ClosedLoopTrxSyncDAL.Setup(post => post.InsertTransaction(dt, transactionItems)).Returns(isValid);
var controller = new ClosedLoopSyncController(appSettings.Object);
SyncDataAnchor result = controller.ClosedLoopSyncService(ClosedLoopTrxList);
在上面的测试代码中,您可以创建
AppSettings
对象并填充所需的值。例如:

public class AppSettings
{
    public string MyValue { get; set; }
}
Mock-appSettings=new-Mock();
var testAppSettings=new-AppSettings{MyValue=“这是一个测试”};
SetupGet(a=>a.Value).Returns(testAppSettings);

现在,当您的控制器类读取
MyValue
属性时,它将获得字符串
“这是一个测试”

,您可以通过appSettings对象模拟所需的值。您应该检查上述解决方案是否正常工作。但在这里,调试器仍然移动到DAL,这应该不是我在下面模拟的预期,它将返回isValid对象ClosedLoopTrxSyncDAL.Setup(post=>post.InsertTransaction(dt,transactionItems))。返回(isValid);我看不到
ClosedLookTrxSyncDAL
在哪里被传递给控制器(或任何其他类)使用。仅仅在模拟中添加
设置
是不够的。您需要将该模拟传递给使用它的类。你在别处注射吗?仅使用单元测试代码很难判断。您可以编辑您的问题并添加传递和调用DAL对象的代码吗?
 Mock<IOptions<AppSettings>> appSettings = new Mock<IOptions<AppSettings>>();

 var testAppSettings = new AppSettings { MyValue = "This is a test" };
 appSettings.SetupGet(a => a.Value).Returns(testAppSettings);