2014-09-19 22 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);