Автоматически обнаруживать сбои при минимизации в ASP.NET MVC - PullRequest
0 голосов
/ 04 февраля 2019

Время от времени я замечаю следующее сообщение об ошибке в верхней части моего CSS-пакета, созданного ASP.NET MVC:

/* Minification failed. Returning unminified contents.
(7933,26): run-time error CSS1019: Unexpected token, found ':'
(7933,26): run-time error CSS1042: Expected function, found ':'
(7933,26): run-time error CSS1062: Expected semicolon or closing curly-brace, found ':'
(7934,30): run-time error CSS1019: Unexpected token, found ':'
(7934,30): run-time error CSS1042: Expected function, found ':'
(7934,30): run-time error CSS1062: Expected semicolon or closing curly-brace, found ':'
 */

Эти ошибки всегда проходят бесшумно при сборке, развертывании и модульных тестах иочень трудно заметить.Есть ли решение, чтобы автоматически их поймать?Трудно получить это из модульного теста, так как нет папки содержимого, копируемой в проект модульного теста.Предпочтительно это должно провалиться при сборке или хотя бы модульном тестировании.

1 Ответ

0 голосов
/ 29 апреля 2019

У меня была та же проблема, и я хотел провести модульное тестирование минификации, после некоторого ложного запуска, пытавшегося насмехаться над BundleContext, я решил просто напрямую проверить минификацию, предоставленную webgrease Microsoft.Ajax.Utilities.Minifier, небольшая проблема была BundleItemявляется внутренним для System.Web.Optimization, поэтому мне пришлось сделать отражение:

  //arrange
  BundleCollection bundles = new BundleCollection();

  // my static bundler config in mvc
  BundleConfig.RegisterBundles(bundles); 

  // act and assert
  Assert.Multiple(() =>
  {
    foreach (var bundle in bundles)
    {
      // CAUTION: Reflection to private member!
      var items = typeof(Bundle).GetProperty("Items", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(bundle) as IEnumerable<Object>;
      foreach (Object item in items)
      {
        var minifier = new Minifier();
        var type = item.GetType();
        var path = type.GetProperty("VirtualPath")?.GetValue(item) as String;

        // todo: handle "BundleDirectoryItem" too ...
        if (type.Name == "BundleItem")
        {
          // todo: transform your virtual path to a physical path to the file at design time
          var file = File.ReadAllText(path);
          String min;
          if (path.EndsWith("css"))
          {
            min = minifier.MinifyStyleSheet(file);
          }
          else
          {
            min = minifier.MinifyJavaScript(file);
          }
          Assert.IsNotNull(min, $"Failed to get minified output for '{path}'");
          Assert.Zero(minifier.Errors.Count, $"Minification failed for '{path}', errors:\r\n{String.Join("\r\n", minifier.Errors)}");
        }
      }
    }
  });
...