kazuakix の日記

Windows Phone とか好きです

ストアアプリでテスト用のサンプルデータを準備する方法

ストアアプリの単体テストでいちいちネットワークからデータを取得するもの迷惑かな...と思って方法を調べていました。ただ、そもそもストアアプリでは PC のファイルへのアクセスが制限されているため、どうすればいいのか見当もつきませんでした。

そんな悩みを twitter でつぶやくと、かずきさんから即座に解答が...

失礼、間違えました。ストアアプリの単体テストプロジェクトで出力ディレクトリにコピーしたファイルを読み込む - かずきのBlog@hatena
わざわざブログにまでまとめて頂きました。ありがとうございます。
 
どうやらテストプロジェクトのコンテンツは Package.Current.InstalledLocation にあるそうです。早速、サンプルデータのビルドアクションを「コンテンツ」、出力ディレクトリにコピーを「常にコピーする」に変更して、テストプロジェクトの前準備で読み込んでみました。

f:id:kazuakix:20140803233430j:plain

using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
using System;
using System.IO;
using System.Threading.Tasks;
using Wakamurasaki.Models;
using Windows.ApplicationModel;
using Windows.Storage;

namespace UnitTest.Windows
{
    [TestClass]
    public class ResTest
    {
        // 前準備
        [TestInitialize]
        public async Task TestInitialize()
        {
            // あらかじめ準備したサンプルデータ
            var srcFile = await Package.Current.InstalledLocation.GetFileAsync(@"SampleData\1405000557.dat");

            // アプリで保存すべきデータ
            var uri   = new BbsUri("http://anago.2ch.net/test/read.cgi/smartphone/1405000557/l50");
            var dstFile = await Wakamurasaki.Common.StorageManager.GetDatFileAsync(uri, FileAccessMode.ReadWrite);

            // コピー
            using (var srcStream = await srcFile.OpenStreamForReadAsync())
            using (var dstStream = await dstFile.OpenStreamForWriteAsync())
            {
                await srcStream.CopyToAsync(dstStream);
            }
        }

        [TestMethod]
        public void WPLoadRes()
        {
            // 読み込みのテストとか
        }
    }
}

ちなみにアプリで保存すべきデータは自前のクラスで URL をもとに適切な StorageFile を返すようにしています。後はそれぞれの Stream を取得して Stream.CopryToAsync() を使ってコピーしてやりました。

結果、サンプルデータがローカルフォルダにコピーされているのを確認しました。これでテストの度に余計な通信をさせずに済みますね。