2017-09-20 37 views
1

私はhttps://github.com/DATA-DOG/go-sqlmockのテストファイルを調べて、モックの目的でストアドプロシージャを作成する方法を理解しました。私が持っている:ストアドプロシージャを使用したpostgresqlのモック

_, err = db.Exec(` 
    CREATE OR REPLACE FUNCTION val() RETURNS INT AS 
     $$ SELECT 1; $$ 
    LANGUAGE sql; 
`) 

if err != nil { 
    t.Fatal(err) 
} 

は私が取得:

all expectations were already fulfilled, call to exec 'CREATE OR REPLACE FUNCTION val() RETURNS INT AS $$ SELECT 1; $$ LANGUAGE sql;' query with args [] was not expected 

場合は、代わりに、私は

 mock.ExpectExec(` 
      CREATE OR REPLACE FUNCTION val() RETURNS INT AS 
       $$ SELECT 1; $$ 
      LANGUAGE sql; 
     `, 
     ).WillReturnResult(sqlmock.NewResult(0, 0)) 

     if err := mock.ExpectationsWereMet(); err != nil { 
      t.Fatal(err) 
     } 

でそれをしようと私が手:私は本当に上の混乱してい

there is a remaining expectation which was not matched: ExpectedExec => expecting Exec which: 
       - matches sql: 'CREATE OR REPLACE FUNCTION val() RETURNS INT AS $$ SELECT 1; $$ LANGUAGE sql;' 
       - is without arguments 
       - should return Result having: 
        LastInsertId: 0 
        RowsAffected: 0 

基本的なストアドプロシージャを設定する方法。

答えて

2

sqlmockライブラリはこれでかなりうまく動作します。

しかしExpectExecが一致するために正規表現を受け取ることに注意してください:あなたは、その関数に何もエスケープせずに受け取ることを期待する正確な文字列を送信している

// ExpectExec expects Exec() to be called with sql query 
// which match sqlRegexStr given regexp. 
// the *ExpectedExec allows to mock database response 
ExpectExec(sqlRegexStr string) *ExpectedExec 

。 、文字列をエスケープこの追加するには

import (
    "regexp" 
) 

をそして期待を追加するとき、あなたの文字列をエスケープ(regexp.QuoteMetaに注意してください):

mock.ExpectExec(regexp.QuoteMeta(` 
    CREATE OR REPLACE FUNCTION val() RETURNS INT AS 
     $$ 
     SELECT 1; 
     $$ 
    LANGUAGE sql; 
`), 
).WillReturnResult(sqlmock.NewResult(0, 0)) 

そうすれば、エスケープ正規表現がマッチしますあなたのexecコマンド

関連する問題