読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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