2014-09-19 23 views
2

我试着关于测试单元测试的this answer,但是当我尝试列举要测试的包中的文件时,我总是得到0。如何对ASP.NET包进行单元测试

下面的代码有什么问题?

[TestFixture] 
public class BundleConfigTests 
{ 
    private TestVirtualPathProvider _vpp; 
    private BundleCollection _bundles; 
    private HttpContextBase _httpContext; 

    [SetUp] 
    public void SetUp() 
    { 
     _vpp = new TestVirtualPathProvider(); 
     var directory = new TestVirtualPathProvider.TestVirtualDirectory("/css/"); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/global.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/global2.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/ie8.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/buttons.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/buttons2.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/navigation.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/dealticket.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/Content/themes/base/jquery-ui.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/Content/Site.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/jquery.loadmask.css", "correct")); 
     _vpp.AddDirectory(directory); 

     BundleTable.VirtualPathProvider = _vpp; 

     _bundles = BundleTable.Bundles; 
     _httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
    } 

    [Test] 
    public void RegisterBundles_Always_AllCssFilesToEachBundle() 
    { 
     BundleConfig.RegisterBundles(_bundles); 

     foreach (var bundle in _bundles.GetRegisteredBundles()) 
     { 
      var bundledFiles = bundle.EnumerateFiles(new BundleContext(_httpContext, _bundles, bundle.Path)); 

      // bundledFiles has zero count! 
      // Also tried getting the non-public Items property of the bundle which is also zero. 
      // var items = bundle.GetType().GetProperty("Items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(bundle, null); 

      foreach (var file in _vpp.GetDirectory("~/css/").Files.OfType<BundleConfigTests.TestVirtualPathProvider.TestVirtualFile>()) 
      { 
       Assert.True(bundledFiles.Any(bf => bf.IncludedVirtualPath == file.VirtualPath), file.VirtualPath + " not bundled"); 
      } 
     } 
    } 

    // Used this test this TestVirtualPathProvider by @HaoKung (https://stackoverflow.com/a/11441016/169034) 
} 

我RegisterBundles实现:

public static void RegisterBundles(BundleCollection bundles) 
{ 
    bundles.Add(new Bundle("~/bundles/styles-" + Cultures.English) 
      .Include("~/css/global.css")); // This item is never in the items collection of the bundle in my unit tests. 
    bundles.Add(new Bundle("~/bundles/styles-" + Cultures.Chinese)); 
} 

参考文献:Bundle unit test suggestion by Hao Kung

回答

0

我使用例如太,发现了这个问题。我通过在我的bundle.Include()中使用{version}并将-1.0.css附加到虚拟文件名来修复它。不知道它为什么会起作用,但它是我可以在包中获取文件的唯一方法。希望有所帮助。

//Setup the vpp to contain the files/directories 
var vpp = new TestVirtualPathProvider(); 
var directory = new TestVirtualPathProvider.TestVirtualDirectory("/dir/"); 
directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/dir/select2-1.0.css", "correct")); 
vpp.AddDirectory(directory); 

// Setup the bundle 
var bundleCollection = new BundleCollection(); 
var bundle = new ScriptBundle("~/bundles/test"); 
BundleTable.VirtualPathProvider = vpp; 
bundle.Include("~/dir/select2-{version}.css"); 
bundleCollection.Add(bundle); 
var mockHttpContext = new Mock<HttpContextBase>(); 

// Verify the bundle repsonse 
var context = new BundleContext(mockHttpContext.Object, bundleCollection, vpp.ToString()); 
var response = bundle.GenerateBundleResponse(context); 
Assert.Equal(@"correct", response.Content);