Использовать 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?

Действительно ли это возможно вообще?

23
задан Martin Vrábel 22 September 2017 в 16:34
поделиться

2 ответа

Похоже, что у вас есть запах кода - конструктор выполняет слишком много работы. В статье приведен набор исправлений для таких сценариев. В основном ответ заключается в том, чтобы только выполнять присваивание в конструкторах, а не выполнять бизнес-логику.

18
ответ дан 29 November 2019 в 01:38
поделиться
var myMockBOC = new Mock<BusinessObjectContext>(null, null);

Это передаст значения NULL для ваших двух параметров.

Другой подход - создать внутренний конструктор, предназначенный только для использования в тестах, и использовать InternalsVisibleTo , чтобы ваша тестовая сборка могла его использовать. К сожалению, у этого есть большой недостаток: если вы подписываете свои сборки, Moq не сможет использовать конструктор . Однако предполагается, что это будет решено в версии 4.0 Moq.

31
ответ дан 29 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: