使用Moq来模拟构造函数?

时间:2010-06-04 16:31:32

标签: c# .net unit-testing constructor 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) { } 

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

这有可能吗?

3 个答案:

答案 0 :(得分:31)

var myMockBOC = new Mock<BusinessObjectContext>(null, null);

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

另一种方法是创建仅供测试使用的内部构造函数,并使用InternalsVisibleTo允许测试程序集使用它。不幸的是,如果您对程序集进行签名,则会有一个很大的缺点:Moq is unable to use the constructor。这应该在Moq的4.0版本中得到解决。

答案 1 :(得分:18)

听起来好像有一股代码气味 - constructor is doing too much work。本文包含一组针对此类方案的修复程序。基本上答案是在构造函数中执行赋值,而不是执行业务逻辑。

答案 2 :(得分:0)

如果您不想使用构造函数参数,可以在模拟它时使用It.IsAny()方法。它将为它传递空值。当您使用此方法而不是编写null时,它将更具可读性。