在ASP.NET MVC捆绑中自动检测缩小失败

问题描述 投票:3回答:1

我不时会在ASP.NET MVC生成的CSS包的顶部注意到以下错误消息:

/* 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 ':'
 */

这些错误总是通过构建,部署和单元测试进行,并且很难注意到。有没有解决方案自动捕捉它们?由于没有内容文件夹被复制到单元测试项目,因此很难从单元测试中获得。优选地,这应该使构建或至少单元测试失败。

asp.net unit-testing model-view-controller deployment bundling-and-minification
1个回答
1
投票

我有同样的问题,并希望单元测试缩小,在一些错误的开始试图模拟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)}");
        }
      }
    }
  });
© www.soinside.com 2019 - 2024. All rights reserved.