web-dev-qa-db-ja.com

分度器のテストケースでメールから値を取得する

ユーザーがサインアップしてメールを受信し、メールに記載されているリンクにアクセスして、アクティベーションサインアップフォームに詳細を入力する分度器テストケースをテストする必要があります。

問題は、メールから引き換えトークンを取得する方法です。私の電子メールには、次のような認証トークンを持つアクティベーションページへのリンクがあります。

http://127.0.0.1:3000/#/signup/redeem/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOTRhYzY3MC1kYTNlLTQyYTUtODVkZS02NDU4ZjVmZGMwYjAiLCJzdWIiOiJ0ZXN0QGNvZWYuY28iLCJpYXQiOjE0Mjc0OTM5MDMsImV4cCI6MTQyODA5ODcwM30.

しかし、URLを作成するためにそのトークンをフェッチするにはどうすればよいですか、またはフローを完了するために電子メールでそのボタンをクリックするにはどうすればよいですか?メールキャッチャーを使用してメールをシミュレートしています。

15
Ashish Gaur

これは私が最近解決したものです。ソリューションがユースケースにも適用されることを願っています。

前提条件:

ステップバイステップの説明:

  1. インストール_mail-listener2_:

    _npm install mail-listener2 --save-dev
    _
  2. 分度器の設定でメールリスナーを初期化し、グローバルに利用できるようにします。

    _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();
    }, 
    _
  3. 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;
    };
    _
  4. テストケースの例:

    _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);
    
             });
        });
    });
    _
29
alecxe

私が実装したソリューションは、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.
    });
});

そして乾杯!

7
Ashish Gaur