我不时会在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 ':'
*/
这些错误总是通过构建,部署和单元测试进行,并且很难注意到。有没有解决方案自动捕捉它们?由于没有内容文件夹被复制到单元测试项目,因此很难从单元测试中获得。优选地,这应该使构建或至少单元测试失败。
我有同样的问题,并希望单元测试缩小,在一些错误的开始试图模拟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)}");
}
}
}
});