我有这段代码,我想为更新功能编写单元测试。
我如何模拟FindByUsername
函数?
我尝试覆盖u.FindByUsername
,但这是行不通的。
此外,我可以编写一些函数以将u *UserLogic
和userName 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"})
}
答案 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