かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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くらいは標準で入っててほしかったかも?