使用Moq来模拟构造函数?

Fra*_*aft 23 .net c# constructor unit-testing moq

我有这样一组构造函数:

public BusinessObjectContext()
         : this(CloudStorageAccount.FromConfigurationSetting("DataConnectionString").TableEndpoint.ToString(),
                CloudStorageAccount.FromConfigurationSetting("DataConnectionString").Credentials) {}

public BusinessObjectContext(string dataConnectionString)
         : this(CloudStorageAccount.Parse(dataConnectionString).TableEndpoint.ToString(),
                CloudStorageAccount.Parse(dataConnectionString).Credentials) { }

public BusinessObjectContext(String baseAddress, StorageCredentials credentials) 
         : base(baseAddress, credentials) { } 
Run Code Online (Sandbox Code Playgroud)

但是在测试/模拟时我需要没有任何连接字符串参数的对象.我怎么能这样做 - 最好是在Moq?

这有可能吗?

wom*_*omp 31

var myMockBOC = new Mock<BusinessObjectContext>(null, null);
Run Code Online (Sandbox Code Playgroud)

这将为您的两个参数传递空值.

另一种方法是创建仅供测试使用的内部构造函数,并用于InternalsVisibleTo允许测试程序集使用它.不幸的是,这有一个很大的缺点,如果你签署你的程序集,Moq无法使用构造函数.这应该在Moq的4.0版本中得到解决.

  • 内部构造函数的缺点是,现在您正在编写代码来支持单元测试. (8认同)
  • 我认为,当有目的要求*public*API不可注射时,这是可以接受的.唯一一次出现问题的方法就是如果你的构造函数不简单,并且包含业务逻辑 - 那么,正如俗话所说,你会遇到两个问题...... (3认同)

Fin*_*las 18

听起来好像你有一个代码味道 - 构造函数做了太多的工作.本文包含一组针对此类方案的修复程序.基本上答案是在构造函数中执行赋值,而不是执行业务逻辑.