asp.net mvc 4 - Is it possible to unit test BundleConfig in MVC4? -


as far can tell, answer no. issue i'm seeing comes include(params string[]) method in system.web.optimization.bundle class. internally invokes system.web.optimization.includedirectory(string, string, bool), in turn uses code:

directoryinfo directoryinfo = new directoryinfo( httpcontext.current.server.mappath(directoryvirtualpath)); 

while possible set httpcontext.current during unit test, can't figure out how make .server.mappath(string directoryvirtualpath) return non-null string. since directoryinfo(string) constructor throws exception when passed null argument, such test fail.

what .net team's recommendation this? have unit test bundling configurations part of integration tests or user acceptance tests?

i have news you, rtm added new static property on bundletable enable more unit tests:

public static func<string, string> mappathmethod; 

edit updated test virtual path provider:

so can this:

public class testvirtualpathprovider : virtualpathprovider { private string normalizevirtualpath(string virtualpath, bool isdirectory = false) { if (!virtualpath.startswith("~")) { virtualpath = "~" + virtualpath; } virtualpath = virtualpath.replace('\\', '/'); // normalize directories have 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 { { 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 { { 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 { { return _directoryfiles; } } public list<virtualdirectory> _subdirs = new list<virtualdirectory>(); public list<virtualdirectory> subdirectories { { return _subdirs; } } public override ienumerable files { { return directoryfiles; } } public override ienumerable children { { throw new notimplementedexception(); } } public override ienumerable directories { { return subdirectories; } } } 

and write unit test using so:

 [testmethod] public void stylebundlecustomvppincludeversionselectstest() { //setup vpp contain 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 bundle scriptbundle bundle = new scriptbundle("~/bundles/test"); bundle.items.virtualpathprovider = vpp; bundle.include("~/dir/style{version}.css"); // verify bundle repsonse bundlecontext context = setupcontext(bundle, vpp); bundleresponse response = bundle.getbundleresponse(context); assert.areequal(@"correct", response.content); } 

Comments

Popular posts from this blog

javascript - backbone.js Collection.add() doesn't `construct` (`initialize`) an object -

php - Get uncommon values from two or more arrays -

Adding duplicate array rows in Php -