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

@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

ログインしている時のテストを少し便利にしてみる

appengine slim3

特にブログに書くことが見つからなかったので無理やり捻出してみた。
Google App EngineSlim3でUserServiceを使った場合のテストを行う場合は、次のようにします。

TestEnvironment environment =
        (TestEnvironment) ApiProxy.getCurrentEnvironment();
environment.setEmail("test@example.com");

このようにしておくと、test@example.comでログインしていることがエミュレート出来るわけですね。
しかしながら、ユーザに紐付くデータってあると思うのですが、それを作るのに別のコードを書かなければならない。そして、ログインを前提にしているロジックは至る所にあるので、まとめたらいいよね。

public class TestUserEnvironment {
    public static void login(String email) {
        TestEnvironment environment =
                (TestEnvironment) ApiProxy.getCurrentEnvironment();
        environment.setEmail(email);
        
        UserProfile userProfile = new UserProfile();
        userProfile.setKey(Datastore.createKey(UserProfile.class, email));
        userProfile.setLastName("TestUserLastName");
        userProfile.setFirstName("TestUserFirstName");
        // userProfile.setHogeHoge("hogehgoe");
        Datastore.put(userProfile);
        
        // 他にも必要なら登録しておく
    }
}

それぞれのテストではこれを使って書けば良いと思う。

@Test
public void ログインしていればTweet出来る() throws Exception {
    int count = tester.count(Tweet.class);
    TestUserEnvironment.login("test@example.com");
    tester.request.setMethod("POST");
    tester.param("tweet", "test tweet");
    tester.start("/tweet");
    TweetController controller = tester.getController();
    assertThat(controller, is(notNullValue()));
    assertThat(tester.isRedirect(), is(false));
    assertThat(tester.getDestinationPath(), is(nullValue()));
    assertThat(tester.response.getStatus(), is(200));

    assertThat("Tweetが投稿されている", tester.count(Tweet.class), is(count + 1));
    Tweet tweet = Datastore.query(Tweet.class).sort(TweetMeta.get().createdAt.desc).asList().get(0);
    UserProfile userProfile = tweet.getUserProfileModelRef().getModel();
    assertThat(tweet.getMessage(), is("test tweet"));
    assertThat(tweet.getCreatedAt(), is(notNullValue()));
    assertThat(userProfile.getKey().getName(), is("test@example.com"));
    assertThat(userProfile.getLastName(), is("TestUserLastName"));
    assertThat(userProfile.getFirstName(), is("TestUserFirstName"));
}

そんだけ。