为什么在调试将单元测试迁移到数据访问层时仍未嘲笑单元测试

时间:2019-04-29 06:41:47

标签: c# unit-testing moq

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

在这里,调试器即使对它进行了模拟并返回了我自己的对象,也会移动到数据访问层。预期:当我调试测试时,不应从业务层移至数据访问层,而应返回现成的对象

1 个答案:

答案 0 :(得分:1)

您需要告诉模拟对象,当某人尝试访问设置时返回什么。例如,如果您的object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 299 ClientWidth = 635 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 24 Top = 208 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object C1: TIdTCPClient IOHandler = IdSSLIOHandlerSocketOpenSSL1 ConnectTimeout = 0 Host = '127.0.0.1' IPVersion = Id_IPv4 Port = 5577 ReadTimeout = -1 Left = 168 Top = 96 end object S1: TIdTCPServer Active = True Bindings = < item IP = '0.0.0.0' Port = 5577 end> DefaultPort = 0 IOHandler = IdServerIOHandlerSSLOpenSSL1 OnConnect = S1Connect OnExecute = S1Execute Left = 240 Top = 96 end object IdServerIOHandlerSSLOpenSSL1: TIdServerIOHandlerSSLOpenSSL SSLOptions.Mode = sslmUnassigned SSLOptions.VerifyMode = [] SSLOptions.VerifyDepth = 0 Left = 464 Top = 40 end object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL Destination = '127.0.0.1:5577' Host = '127.0.0.1' MaxLineAction = maException Port = 5577 DefaultPort = 0 SSLOptions.Mode = sslmUnassigned SSLOptions.VerifyMode = [] SSLOptions.VerifyDepth = 0 Left = 320 Top = 184 end end 类如下所示:

AppSettings

在上面的测试代码中,您可以创建一个public class AppSettings { public string MyValue { get; set; } } 对象并填充所需的值。例如:

AppSettings

现在,当您的控制器类读取 Mock<IOptions<AppSettings>> appSettings = new Mock<IOptions<AppSettings>>(); var testAppSettings = new AppSettings { MyValue = "This is a test" }; appSettings.SetupGet(a => a.Value).Returns(testAppSettings); 属性时,它将获得字符串MyValue