Наконец-то я понял, вот что я сделал.
В каждом из моих тестовых классов (или методов, если только небольшое количество тестов в классе требует MQ), которые имели зависимости MQ, я добавил следующее к объявлению класса (или метода)
#if !RunMQTests
[Ignore]
#endif
Это отключает тесты, если у вас не установлен условный символ компиляции RunMQTests
, этот символ не определен в файлах проекта, поэтому тесты по умолчанию отключены.
Чтобы включить эти тесты, чтобы разработчикам не приходилось запоминать, установлен ли у них MQ, и добавлять или удалять символ условной компиляции, я создал специальную задачу сборки, которая сообщит нам, установлен ли MQ.
/// <summary>
/// An MSBuild task that checks to see if MQ is installed on the current machine.
/// </summary>
public class IsMQInstalled : Task
{
/* Constructors removed for brevity */
/// <summary>Is MQ installed?</summary>
[Output]
public bool Installed { get; set; }
/// <summary>The method called by MSBuild to run this task.</summary>
/// <returns>true, task will never report failure</returns>
public override bool Execute()
{
try
{
// this will fail with an exception if MQ isn't installed
new MQQueueManager();
Installed = true;
}
catch { /* MQ is not installed */ }
return true;
}
}
Тогда нам просто нужно подключить это к процессу сборки, добавив задачу в начало файла тестового проекта.
<UsingTask TaskName="IsMQInstalled" AssemblyFile="..\..\References\CustomBuildTasks.dll" />
И вызовите новую пользовательскую задачу в цели BeforeBuild
и установите символ условного компиляции, если на этом компьютере установлен MQ.
<Target Name="BeforeBuild">
<IsMQInstalled>
<Output TaskParameter="Installed" PropertyName="MQInstalled" />
</IsMQInstalled>
<Message Text="Is MQ installed: $(MQInstalled)" Importance="High" />
<PropertyGroup Condition="$(MQInstalled)">
<DefineConstants>$(DefineConstants);RunMQTests</DefineConstants>
</PropertyGroup>
</Target>
Это позволяет пользователям, у которых установлен MQ, запускать наши интеграционные тесты MQ, в то же время не прерывая запуск тестов для пользователей, которые этого не делают.