10

Theo như tôi có thể nói, câu trả lời là không. Vấn đề tôi thấy xuất phát từ phương thức Include(params string[]) trong lớp System.Web.Optimization.Bundle. Bên này gọi System.Web.Optimization.IncludeDirectory(string, string, bool), do đó sử dụng mã này:Có thể kiểm tra đơn vị BundleConfig trong MVC4 không?

DirectoryInfo directoryInfo = new DirectoryInfo(
    HttpContext.Current.Server.MapPath(directoryVirtualPath)); 

Mặc dù có thể để thiết lập HttpContext.Current trong một thử nghiệm đơn vị, tôi không thể tìm ra cách để làm cho .Server.MapPath(string directoryVirtualPath) trở lại của một chuỗi không null. Vì hàm tạo DirectoryInfo(string) ném một ngoại lệ khi thông qua một đối số null, một kiểm tra như vậy sẽ luôn thất bại.

Khuyến cáo của nhóm .NET về điều này là gì? Chúng tôi có phải kiểm tra cấu hình đóng gói đơn vị như một phần của kiểm tra tích hợp hoặc kiểm tra chấp nhận của người dùng không?

+4

Thật sao? Tôi sẽ phải bắt đầu một tiền thưởng trên này quá ??? – danludwig

Trả lời

9

Tôi có một số tin tốt cho bạn, cho RTM chúng tôi đã thêm một tính chất tĩnh mới trên BundleTable để cho phép nhiều đơn vị xét nghiệm:

public static Func<string, string> MapPathMethod; 

Sửa cập nhật với một thử nghiệm ảo cung cấp đường dẫn:

Vì vậy, bạn có thể làm một cái gì đó như thế này:

public class TestVirtualPathProvider : VirtualPathProvider { 

    private string NormalizeVirtualPath(string virtualPath, bool isDirectory = false) { 
     if (!virtualPath.StartsWith("~")) { 
      virtualPath = "~" + virtualPath; 
     } 
     virtualPath = virtualPath.Replace('\\', '/'); 
     // Normalize directories to always have an ending "/" 
     if (isDirectory && !virtualPath.EndsWith("/")) { 
      return virtualPath + "/"; 
     } 
     return virtualPath; 
    } 

    // Files on disk (virtualPath -> file) 
    private Dictionary<string, VirtualFile> _fileMap = new Dictionary<string, VirtualFile>(); 
    private Dictionary<string, VirtualFile> FileMap { 
     get { return _fileMap; } 
    } 

    public void AddFile(VirtualFile file) { 
     FileMap[NormalizeVirtualPath(file.VirtualPath)] = file; 
    } 

    private Dictionary<string, VirtualDirectory> _directoryMap = new Dictionary<string, VirtualDirectory>(); 
    private Dictionary<string, VirtualDirectory> DirectoryMap { 
     get { return _directoryMap; } 
    } 

    public void AddDirectory(VirtualDirectory dir) { 
     DirectoryMap[NormalizeVirtualPath(dir.VirtualPath, isDirectory: true)] = dir; 
    } 

    public override bool FileExists(string virtualPath) { 
     return FileMap.ContainsKey(NormalizeVirtualPath(virtualPath)); 
    } 

    public override bool DirectoryExists(string virtualDir) { 
     return DirectoryMap.ContainsKey(NormalizeVirtualPath(virtualDir, isDirectory: true)); 
    } 

    public override VirtualFile GetFile(string virtualPath) { 
     return FileMap[NormalizeVirtualPath(virtualPath)]; 
    } 

    public override VirtualDirectory GetDirectory(string virtualDir) { 
     return DirectoryMap[NormalizeVirtualPath(virtualDir, isDirectory: true)]; 
    } 

    internal class TestVirtualFile : VirtualFile { 
     public TestVirtualFile(string virtualPath, string contents) 
      : base(virtualPath) { 
      Contents = contents; 
     } 

     public string Contents { get; set; } 

     public override Stream Open() { 
      return new MemoryStream(UTF8Encoding.Default.GetBytes(Contents)); 
     } 
    } 

    internal class TestVirtualDirectory : VirtualDirectory { 
     public TestVirtualDirectory(string virtualPath) 
      : base(virtualPath) { 
     } 

     public List<VirtualFile> _directoryFiles = new List<VirtualFile>(); 
     public List<VirtualFile> DirectoryFiles { 
      get { 
       return _directoryFiles; 
      } 
     } 

     public List<VirtualDirectory> _subDirs = new List<VirtualDirectory>(); 
     public List<VirtualDirectory> SubDirectories { 
      get { 
       return _subDirs; 
      } 
     } 

     public override IEnumerable Files { 
      get { 
       return DirectoryFiles; 
      } 
     } 

     public override IEnumerable Children { 
      get { throw new NotImplementedException(); } 
     } 

     public override IEnumerable Directories { 
      get { 
       return SubDirectories; 
      } 
     } 
    } 

Sau đó viết một bài kiểm tra đơn vị bằng cách sử dụng như sau:

[TestMethod] 
    public void StyleBundleCustomVPPIncludeVersionSelectsTest() { 
     //Setup the vpp to contain the files/directories 
     TestVirtualPathProvider vpp = new TestVirtualPathProvider(); 
     var directory = new TestVirtualPathProvider.TestVirtualDirectory("/dir/"); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/dir/style1.0.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/dir/style.css", "wrong")); 
     vpp.AddDirectory(directory); 

     // Setup the bundle 
     ScriptBundle bundle = new ScriptBundle("~/bundles/test"); 
     bundle.Items.VirtualPathProvider = vpp; 
     bundle.Include("~/dir/style{version}.css"); 

     // Verify the bundle repsonse 
     BundleContext context = SetupContext(bundle, vpp); 
     BundleResponse response = bundle.GetBundleResponse(context); 
     Assert.AreEqual(@"correct", response.Content); 
    } 
+1

Thật không may, cách giải quyết này không còn khả thi trong phiên bản mới nhất vì MapPathMethod đã bị xóa. Bạn có thể tư vấn về một chiến lược thay thế (có thể sử dụng VirtualPathProvider) không? –

+1

Chắc chắn đã thêm vpp thử nghiệm mà tôi sử dụng cho các bài kiểm tra đơn vị –

+0

Có vẻ như nó đã thay đổi một lần nữa, không còn thuộc tính Mục nào trong gói nữa. – Giedrius

5

Trong .Net 4.5 mọi thứ đã thay đổi đôi chút. Đây là một phiên bản làm việc của câu trả lời được phê duyệt được cập nhật để phù hợp với những thay đổi này (Tôi đang sử dụng Autofac). Lưu ý "GenerateBundleResponse" thay vì "GetBundleResponse":

[Fact] 
    public void StyleBundleIncludesVersion() 
    { 
     //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/style1.0.css", "correct")); 
     directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/dir/style.css", "wrong")); 
     vpp.AddDirectory(directory); 

     // Setup the bundle 
     var bundleCollection = new BundleCollection(); 
     var bundle = new ScriptBundle("~/bundles/test"); 
     BundleTable.VirtualPathProvider = vpp; 
     bundle.Include("~/dir/style{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); 
    } 
Các vấn đề liên quan