【问题标题】:Unit Testing loading and saving files in Windows Store 8 WinRT单元测试在 Windows Store 8 WinRT 中加载和保存文件
【发布时间】:2016-03-25 06:57:42
【问题描述】:

我在 Visual Studio 2013 中为 Windows 8 Metro(又名 WinRT)创建了一个应用程序。我通过使用 DataContractSerializer 序列化为 XML 来保存用户数据。我还为单元测试添加了一个单元测试项目。我想测试从 XML 保存/加载。它在我的应用程序中运行良好,我可以浏览到“LocalState”文件夹并验证 XML 是否包含正确的数据。然而,单元测试方法似乎并没有像主应用程序那样创建任何 XML 文件,尽管声称已经“通过”。

单元测试是否将其数据存储在其他地方?我如何才能真正访问 XML 文件?理想情况下,我想使用单元测试来生成大型数据集,然后将它们加载到主应用程序中,因此仅保存/加载/检查相等性是不够的。

这是我用来保存数据的代码,它在主应用程序中也能正常工作。

string localData = ObjectSerializer<myObject>.Serialize(_myObject);

            if (!string.IsNullOrEmpty(localData))
            {
                StorageFile localFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("Data.xml", CreationCollisionOption.ReplaceExisting);
                await FileIO.WriteTextAsync(localFile, localData);
            }

【问题讨论】:

  • 没有通用的“单元测试”——所以除非你发布你的测试代码,否则绝对没有办法找出你的测试出了什么问题。
  • 就创建单元测试而言,您可能走错了路。它与浏览文件夹、读取光盘和存储大量数据无关。

标签: c# unit-testing windows-8 windows-runtime


【解决方案1】:

单元测试项目可能正在 AppData\Local\Packages 中创建它自己的(临时的、隐藏的)包 -- 我的是。 我使用了两步法,在MSTest - DeploymentItem attribute unavailable on windows store test project 中提到过

我的数据位于单元测试项目的子文件夹中,例如SMEPS_SM_SealBeach_Test,我想要这个文件夹及其所有文件在我的应用程序本地文件夹中。这些文件被标记为总是复制

首先,在构建后使用 构建事件,如下所示:

if not exist "$(TargetDir)AppX" mkdir "$(TargetDir)AppX"
if not exist "$(TargetDir)AppX\SMEPS_SM_SealBeach_Test" mkdir "$(TargetDir)AppX\SMEPS_SM_SealBeach_Test"
copy /Y "$(TargetDir)SMEPS_SM_SealBeach_Test\*.*" "$(TargetDir)AppX\SMEPS_SM_SealBeach_Test\"

这会将您的数据导入 Appx。

然后,在运行时,将数据从 Appx 复制到应用本地文件夹:

    [TestInitialize]
    async public Task TestDatabaseInitilize()
    {
        //manually copied data from 
        var site = "SMEPS_SM_SealBeach_Test";
        var appx = Package.Current.InstalledLocation;
        var reposTestFolder = await appx.GetFolderAsync(site);
        var testFiles = await reposTestFolder.GetFilesAsync();

        var localfolder = ApplicationData.Current.LocalFolder;
        var reposFolder = await localfolder.CreateFolderAsync(site, CreationCollisionOption.OpenIfExists);
        foreach (var file in testFiles)
        {
            await file.CopyAsync(reposFolder);
        }
    }

现在该应用拥有SMEPS_SM_SealBeach_Test 文件夹及其所有数据可供测试使用。

【讨论】:

    【解决方案2】:

    我认为,您应该从这个功能中抽象出一个接口,允许您对应用程序的其余部分进行单元测试,而无需手动验证文件是否真的在您的磁盘上创建。

    然后通过模拟或伪造它,您只需检查接口方法是否已使用 good 参数调用。

    public interface ILocalDataService {
      Task SaveToLocal(string localData, string filename)
      }
    

    为了进一步的测试,如果你需要读取那些本地数据,在这个接口中添加一个加载方法。然后通过模拟它,您将能够使此方法返回您想要的任何内容,甚至是损坏的数据:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多