かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

FriendlyでFrameを使ったアプリをテストする

追記

blog.okazuki.jp

この記事の内容より良い方法がありましたので上の記事に書いてます。

あと、この記事に書いたWPFContentControl足してもらえたみたいです。

元記事

という要望がありました。

WindowControlのLogicalTreeで辿ればいいや!って思ってたら、FrameはContentにPageを持つからPageの中はLogicalTree切れてるので検索できないっぽいですね?(自分では試してない)

ということなので、Frameをとってきて、そいつのContentのLogicalTreeを辿ればいいということになります。FriendlyのWPF用のパッケージには、FrameやらPageやらを操作するためのクラスがないということで、無いならまずは作ります。FrameもPageもContentControlなので、WPFContentControlというクラスを用意します。

class WPFContentControl : WPFControlBase4<ContentControl>
{
    public WPFContentControl(AppVar c) : base(c)
    {
    }

    public AppVar Content { get { return this.Dynamic().Content; } }
}

あとは、こんな雰囲気でFrameをとってContentをとってContentのLogicalTreeから目的のコントロールをとる感じでいけます。さくっと作ったボタン押したらHello worldってなるアプリだとこんな感じ。ButtonとかTextBlockとかのとり方はアプリに合わせて変わるので、よしなに。

[TestClass]
public class UnitTest1
{
    private Process process;
    private WindowsAppFriend app;

    [TestInitialize]
    public void Initialize()
    {
        this.process = Process.Start("WpfApplication5.exe");
        this.app = new WindowsAppFriend(this.process);
    }

    [TestCleanup]
    public void Cleanup()
    {
        this.app.Dispose();
        this.process.Kill();
    }

    [TestMethod]
    public void TestMethod1()
    {
        var window = new WindowControl(app.Type<Application>().Current.MainWindow);
        // Point1 Frameをとる
        var frame = new WPFContentControl(window.LogicalTree().ByType<Frame>().Single());
        // Point2 FrameのContentをとる(こいつがPage)
        var page = new WPFContentControl(frame.Content);
        // Point3 PageのLogicalTreeをとってごにょごにょする
        var btn = new WPFButtonBase(page.LogicalTree().ByType<Button>().Single());
        var txt = new WPFTextBlock(page.LogicalTree().ByType<TextBlock>().Single());
        Assert.AreEqual("", txt.Text);
        btn.EmulateClick();
        Assert.AreEqual("Hello world", txt.Text);
    }
}

WPFContentControlくらいは標準で入っててほしかったかも?