Некоторым организациям требуются эти бессмысленные цифры, и у них возникают проблемы, не связанные с затратами. Для компаний, имеющих дело с первичной информацией, «достаточно хорошо» недостаточно. У меня была точно такая же проблема, и, как и у Klas Mellbourn, нужно добраться до 100% (если не выше!)
Следующее сработало для меня. Хотя я бы предпочел отметить это «Исключить из покрытия кода»
public class Global : HttpApplication
{
public override void Init()
{
AreaRegistration.RegisterAllAreas(); //will error out on app_start
base.Init();
}
/// <summary>
/// Application_Start method.
/// </summary>
/// <param name="sender">The caller</param>
/// <param name="e">The event arguments</param>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "KMM: This method is called dynamically by the framework.")]
protected void Application_Start(object sender, EventArgs e)
{
var container = StructureMapRegistry.Initialize();
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapResolver(container);
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
Тогда юнит-тест выглядел так:
public class GlobalTest : Global
{
private HttpRequestMessage FakeRequest;
DateTime? effectiveDate = DateTime.Now.AddYears(-4);
private string policyNumber = "1234567890";
[TestMethod]
public void ApplicationStart()
{
var sender = new object();
var e = new EventArgs();
try
{
Application_Start(sender, e); // this will error b/c not fully loaded yet.
}
catch (InvalidOperationException)
{
Thread.Sleep(2000); // give the app time to launch
Application_Start(sender, e);
}
Assert.IsTrue(true);
}
}
и, наконец, мне нужно было установить флаг в моем WebApiConfig, чтобы предотвратить регистрацию маршрутов дважды.
public static class WebApiConfig
{
private static bool isRegistered;
/// <summary>
/// Registers the configuration.
/// </summary>
/// <param name="config">The Http Configuration.</param>
public static void Register(HttpConfiguration config)
{
if (isRegistered)
{
return;
}
config.MapHttpAttributeRoutes();
Теперь, прежде чем ненавистники и пуристы начнут отмечать это, задача состоит в том, чтобы протестировать весь код. Я лично ненавижу модифицировать код для соответствия тестам. Это не то же самое, что сделать код тестируемым. Добавление флага isRegistered является примером того типа артефакта, который необходим для поддержки теста, которому необходимо вызвать app_start 2x. Это мелочь, и так как этот код вызывается только через app_start, я не буду слишком много суетиться по этому поводу.
Мне, безусловно, было бы интересно узнать, что другие сделали в этом отношении.