首页 > 解决方案 > 验证 Web 应用程序中的静态资源

问题描述

像大多数 Web 应用程序一样,我的静态资源必须是部署的一部分,否则用户会收到来自服务器的 404 响应。我的想法是使用单元测试来验证两件事 1. 资源存在,2. 内容没有被修改。我尝试了以下代码,但它期望(我认为)文件存在于单元测试项目中。

解决方案结构:WebApplicationProject - ... - public - file.* - otherfile.* - web.config

WebApplicationProject.Tests - AssetTests.cs

我是否将这一切都搞错了,这不应该是单元测试的一部分和 CI 构建过程(Azure DevOps)上的其他一些步态,还是我错过了一些非常明显的东西?我可能会问错误的问题并以错误的方式解决这个问题,因为我知道我不是第一个想要做这种事情的人。

我已经阅读了有关使用文件进行测试的其他帖子,但是它们都在使用测试文件来驱动数据,以通过某种消耗文件的方法或某些生成文件进行比较的过程来输入数据。我不想做这两件事。

我还使用了使文件成为嵌入式资源的设置,并始终与项目一起部署,但单元测试项目仍然无法按照我的方式访问文件。

[TestClass]
public class AssetTests
{
    [TestMethod]
    [DeploymentItem(@".\files\file.*")]
    public void AwardLetters()
    {
        string path = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "file.*");// gets the working path for the testing dll, no files exist here.
        Assert.IsTrue(File.Exists("file.*"), "FAIL: file {0} not found", "file.*");// nothing I have tried has access to the projects static resources
    }
}

到目前为止,所有结果都以文件未找到异常结束。

我确实尝试使用以下方法手动加载引用:Assembly a = Assembly.LoadFrom("WebApplicationProject");// also used WebApplicationProject.dll 这找不到引用。是的,引用属性 copy local 设置为 true。

我对所有建议持开放态度,但如果您建议我有两份文件,请充分解释为什么这是可取的。

标签: c#asp.netunit-testing

解决方案


好吧,这是我的 MVP。我将把它打开一段时间,但希望有人有更好的解决方案,访问这样的资源不会这么困难,我觉得应该有一种方法可以访问应用程序目录而不必嵌入文件程序集只是为了将它传递给一个测试方法。

[TestMethod]
    public void FileExists()
    {
        Assembly a = Assembly.LoadFrom(@"..\..\..\WebApplicationProject\bin\WebApplicationProject.dll");
        string t = string.Join("", a.GetManifestResourceNames());
        Assert.IsTrue(t.Contains("file.*"));
    }

现在我有了文件,我还可以创建一个测试来测试文件的内容以验证它的内容。

我仍然认为这是鸭带,一点也不优雅。因此,请分享您对我的解决方案的答案和批评。


推荐阅读