ユーザーがサインアップしてメールを受信し、メールに記載されているリンクにアクセスして、アクティベーションサインアップフォームに詳細を入力する分度器テストケースをテストする必要があります。
問題は、メールから引き換えトークンを取得する方法です。私の電子メールには、次のような認証トークンを持つアクティベーションページへのリンクがあります。
http://127.0.0.1:3000/#/signup/redeem/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOTRhYzY3MC1kYTNlLTQyYTUtODVkZS02NDU4ZjVmZGMwYjAiLCJzdWIiOiJ0ZXN0QGNvZWYuY28iLCJpYXQiOjE0Mjc0OTM5MDMsImV4cCI6MTQyODA5ODcwM30.
しかし、URLを作成するためにそのトークンをフェッチするにはどうすればよいですか、またはフローを完了するために電子メールでそのボタンをクリックするにはどうすればよいですか?メールキャッチャーを使用してメールをシミュレートしています。
これは私が最近解決したものです。ソリューションがユースケースにも適用されることを願っています。
前提条件:
mail-listener2
_パッケージpromises
の概念の理解ステップバイステップの説明:
インストール_mail-listener2
_:
_npm install mail-listener2 --save-dev
_
分度器の設定でメールリスナーを初期化し、グローバルに利用できるようにします。
_onPrepare: function () {
var MailListener = require("mail-listener2");
// here goes your email connection configuration
var mailListener = new MailListener({
username: "imap-username",
password: "imap-password",
Host: "imap-Host",
port: 993, // imap port
tls: true,
tlsOptions: { rejectUnauthorized: false },
mailbox: "INBOX", // mailbox to monitor
searchFilter: ["UNSEEN", "FLAGGED"], // the search filter being used after an IDLE notification has been retrieved
markSeen: true, // all fetched email willbe marked as seen and not fetched next time
fetchUnreadOnStart: true, // use it only if you want to get all unread email on lib start. Default is `false`,
mailParserOptions: {streamAttachments: true}, // options to be passed to mailParser lib.
attachments: true, // download attachments as they are encountered to the project directory
attachmentOptions: { directory: "attachments/" } // specify a download directory for attachments
});
mailListener.start();
mailListener.on("server:connected", function(){
console.log("Mail listener initialized");
});
global.mailListener = mailListener;
}),
onCleanUp: function () {
mailListener.stop();
},
_
email
が取得されるのを待つヘルパーgetLastEmail()
関数を作成します。
_function getLastEmail() {
var deferred = protractor.promise.defer();
console.log("Waiting for an email...");
mailListener.on("mail", function(mail){
deferred.fulfill(mail);
});
return deferred.promise;
};
_
テストケースの例:
_describe("Sample test case", function () {
beforeEach(function () {
browser.get("/#login");
browser.waitForAngular();
});
it("should login with a registration code sent to an email", function () {
element(by.id("username")).sendKeys("MyUserName");
element(by.id("password")).sendKeys("MyPassword");
element(by.id("loginButton")).click();
browser.controlFlow().await(getLastEmail()).then(function (email) {
expect(email.subject).toEqual("New Registration Code");
expect(email.headers.to).toEqual("[email protected]");
// extract registration code from the email message
var pattern = /Registration code is: (\w+)/g;
var regCode = pattern.exec(email.text)[1];
console.log(regCode);
});
});
});
_
私が実装したソリューションは、mailcatcher [〜#〜] api [〜#〜] を使用することでした。少し下にスクロールすると、APIについて次のことがわかります。
かなりRESTfulなURLスキーマは、JSONのメッセージのリストを/ messagesからダウンロードし、各メッセージのメタデータを/messages/:id.jsonでダウンロードし、次に関連する部分を/messages/:id.htmlと/ messages /:idでダウンロードできることを意味します。デフォルトのHTMLおよびプレーンテキストバージョンの場合は.plain、CIDによる個々の添付ファイルの場合は/ messages /:id /:cid、または/messages/:id.sourceを使用したメッセージ全体。
したがって、最初にjson応答全体をフェッチし、それを解析して、最新の電子メールIDをフェッチします。
// Returns the last email id
function(emails, user) {
var email, recipient;
for(var i = emails.length - 1; i >= 0; i--) {
email = emails[i];
for(var j = 0; j < email.recipients.length ; j++) {
recipient = email.recipients[j];
if(recipient == "<"+user+">") {
return email.id;
}
}
}
};
その電子メールIDを使用して、/messages/:id.plain
を押すことで電子メールの本文を取得できます(もちろん、電子メールのソースコードや電子メールでレンダリングされたhtmlのフェッチなど、さらに多くのバリエーションがあります。メッセージのみが必要です)、本文を解析するだけです。必要なものをフェッチするには、次のコードを使用します。
browser.driver.get(mailcatcherUrl+"/messages");
browser.driver.findElement(by.tagName('body')).getText().then(function(response) {
var emails, lastEmailId, partialTokens ;
emails = JSON.parse(response);
lastEmailId = getLastEmailId(emails, user);
browser.driver.get(mailcatcherUrl+"/messages/"+lastEmailId+".plain");
browser.driver.findElement(by.tagName('body')).getText().then(function(lastEmail) {
// use latestEmail to get what you want.
});
});
そして乾杯!