Как выполнить модульное тестирование пакетов 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://stackru.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));
}
Список литературы: Пакетный тестовый пакет Хао Кунга
2 ответа
Я тоже использовал этот пример и нашел эту проблему. Я исправил это с помощью {version}
в моем bundle.Include()
и добавление -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);
У меня была похожая проблема, и, похоже, она связана с реализацией . Когда вы запустите это:
directory.DirectoryFiles.Add(new TestVirtualPathProvider.TestVirtualFile("/css/global.css", "correct"));
На самом деле он не добавляет файл в FileMap (_fileMap
), что означает, что Bundle его не найдет.
Вам нужно будет отредактировать методAddDirectory
вTestVirtualPathProvider
от Хао Кунга, чтобы вместо этого было вот так:
public void AddDirectory(VirtualDirectory dir)
{
DirectoryMap[NormalizeVirtualPath(dir.VirtualPath, isDirectory: true)] = dir;
foreach (var file in dir.Files)
{
AddFile((VirtualFile)file);
}
}
Это фактически добавит файлы в FileMap.
Насколько я понимаю, и по некоторым подсказкам, единственная причина, по которой добавление{Version}
работает, потому что файл не будет найден иSystem.Web.Optimization
будет иметь какой-то запасной вариант, который работает только тогда, когда версия присутствует.