我如何在界面内部模拟特定的嵌入式方法

时间:2019-05-06 05:45:01

标签: go

我有这段代码,我想为更新功能编写单元测试。

我如何模拟FindByUsername函数?

我尝试覆盖u.FindByUsername,但这是行不通的。

此外,我可以编写一些函数以将u *UserLogicuserName string用作输入参数,并执行u.FindByUsername()并对该函数进行模拟,但这不是一个干净的解决方案,我需要一个更好的模拟解决方案UserOperation界面中的方法。

package logic

import (
    "errors"
    "fmt"
)

var (
    dataStore = map[string]*User{
        "optic": &User{
            Username: "bla",
            Password: "ola",
        },
    }
)

//UserOperation interface
type UserOperation interface {
    Update(info *User) error
    FindByUsername(userName string) (*User, error)
}

//User struct
type User struct {
    Username string
    Password string
}

//UserLogic struct
type UserLogic struct {
    UserOperation
}

//NewUser struct
func NewUser() UserOperation {
    return &UserLogic{}
}

//Update method
func (u *UserLogic) Update(info *User) error {
    userInfo, err := u.FindByUsername(info.Username)
    if err != nil {
        return err
    }
    fmt.Println(userInfo.Username, userInfo.Password)
    fmt.Println("do some update logic !!!")
    return nil
}

//FindByUsername method
func (u *UserLogic) FindByUsername(userName string) (*User, error) {
    userInfo := &User{}
    var exist bool
    if userInfo, exist = dataStore[userName]; !exist {
        return nil, errors.New("user not found")
    }
    return userInfo, nil
}

更新

我尝试用此代码模拟功能

func TestUpdate2(t *testing.T) {
    var MockFunc = func(userName string) (*User, error) {
        return &User{Username:"foo", Password:"bar"},nil
    }
    user := NewUser()
    user.FindByUsername = MockFunc
    user.Update(&User{Username:"optic", Password:"ola"})
}

1 个答案:

答案 0 :(得分:1)

您正在<!--Active class on click--> $(document).ready(function(){ $('.nav li').click(function(){ $('.nav li').removeClass('active'); $(this).addClass('active'); }); }); 界面中混合两个抽象级别:UserOperation取决于Update。要使FindByUsername可测试,您需要将Update功能注入到您的UserFinder方法中。您可以例如通过在Update结构中定义一个字段:

UserLogic