2017-11-08 19 views
1

データベースを任意に使用するNewDaoの機能をテストすることはできません。返されたDaoがnilクライアントもnilもないかどうかチェックしたい。エラーを返さないようにsqlmockをスタブするにはどうすればよいですか?

type Dao struct { 
    client ClientDao 
    product ProductDao 
} 

func (d *Dao) Client() ClientDao { 
    return d.client 
} 

func (d *Dao) Product() ProductDao { 
    return d.product 
} 

func NewDao(db *sql.DB) (*Dao, error) { 
    if db == nil { 
    return nil, errors.New("Can't create a dao from nil database") 
    } 
    client, err := newClientDao(db) // Uses db arbitrarily 
    if err != nil { 
    return nil, err 
    } 
    product, err := newProductDao(db) // Uses db arbitrarily 
    if err != nil { 
    return nil, err 
    } 
    return &Dao{client, product}, nil 
} 

Iのsqlmockを使用してテストNewDao()が、私はモックニーズが期待するのかわからないので、それは常に失敗します。

func TestNewDao(t *testing.T) { 
    db, mock, err := sqlmock.New() 
    if err != nil { 
    t.Fatal("Can't create database for test dao") 
    } 

    // How to set mock to expect anything and never fail? 
    // mock.ExpectQuery(any) ? 

    dao, err := NewDao(db) 

    // err is never nil, because mock has no expectations 

    if err != nil { 
    t.Fatal("Can't create dao for test dao.User %q", err) 
    } 
    if dao.User() == nil { 
    t.Fatalf("User dao is nil") 
    } 
    if dao.Client() == nil { 
    t.Fatalf("Client dao is nil") 
    } 
} 

いずれかが私の目的を達成するためsqlmockをスタブする方法を知っていますか?または、sqlmock libの代替を指定できますか?あなたはNewDaoであなたの最後の見返りに2番目の項目が欠落している

答えて

1

return &Dao{client, product}

次のようになります。

return &Dao{client, product}, nil

リターン文がで宣言されたすべてのものを "返却" しなければなりません関数のヘッダ。

+0

ありがとうございました。私はただエラーを修正しました。 –

+0

私が望むのは、任意のdbを使用するUserDaoの実装に依存しないテストを行う方法を見つけ出すことです。 –

0

Dao.ClientDao.Productのメソッド自体は、依存関係を呼び出すことはありません。そのため、あなたは何もモックすることができません。これらの2つの方法をテストするためにモックを使用することには意味がありません。

これらのようなライナーをテストするのは最も賢明ではないかもしれませんが、とにかくテストしたいのであれば、返される値が仮定しているフィールドの値と同じであることを確認する必要があります復帰する。

func TestDaoClient(t *testing.T) { 
    var client ClientDao // TODO: prepare a client dao value for test 

    tests := []struct{ 
     name string 
     dao *Dao 
     want ClientDao 
    }{{ 
     name: "should return client dao", 
     dao: &Dao{client: client}, 
     want: client, 
    }, { 
     name: "should return nil", 
     dao: &Dao{client: nil}, 
     want: nil, 
    }} 

    for _, tt := range tests { 
     t.Run(tt.name, func(t *testing.T) { 
      if got := tt.dao.Client(); !reflect.DeepEqual(got, tt.want) { 
       t.Errorf("client got=%v, want=%v", got, tt.want) 
      } 
     })  
    } 
} 

Dao.Productの方法でも同じことができます。

+0

ありがとう!私はこのテストを行うためにクライアントを作成するためにnewClientDao(db)関数を使う必要はありません。私は私の質問に悪い例を置く。 –

+0

私は私の例を編集しました。私はそれが助けて欲しい –

関連する問題