我正在为我的 PostLoginHandler 编写单元测试,需要模拟一个 session 中间件函数。在我的处理程序中,它调用了 session.Update(),我想模拟它以返回 nil。
阅读各种答案后,我的第一直觉是制作一个 SessionManager 界面,但即便如此我也不清楚如何进行。
main.go:
func PostLoginHandler(c web.C, w http.ResponseWriter, r *http.Request) {
r.ParseForm()
user, pass := r.PostFormValue("username"), r.PostFormValue("password")
ctx := context.GetContext(c)
if !authorizeUser(user, pass) {
http.Error(w, "Wrong username or password", http.StatusBadRequest)
return
}
ctx.IsLogin = true
err := session.Update(ctx) \\ mock this function call.
if err != nil {
log.Println(err)
return
}
http.Redirect(w, r, "/admin/", http.StatusFound)
}
主要测试:
var loginTests = []struct {
username string
password string
code int
}{
{"admin", "admin", http.StatusFound},
{"", "", http.StatusBadRequest},
{"", "admin", http.StatusBadRequest},
{"admin", "", http.StatusBadRequest},
{"admin", "badpassword", http.StatusBadRequest},
}
func TestPostLoginHandler(t *testing.T) {
// setup()
ctx := &context.Context{IsLogin: false, Data: make(map[string]interface{})}
c := newC()
c.Env["context"] = ctx
for k, test := range loginTests {
v := url.Values{}
v.Set("username", test.username)
v.Set("password", test.password)
r, _ := http.NewRequest("POST", "/login", nil)
r.PostForm = v
resp := httptest.NewRecorder()
m.ServeHTTPC(c, resp, r)
if resp.Code != test.code {
t.Fatalf("TestPostLoginHandler #%v failed. Expected: %v\tReceived: %v", k, test.code, resp.Code)
}
}
}
最佳答案
我给你推荐一对链接:
Testing in Go - Github :此链接解释了如何使用 mux 包进行响应的模拟路由。
例子:
func TestUsersService_Get_specifiedUser(t *testing.T) {
setup()
defer teardown()
mux.HandleFunc("/users/u",
func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{"id":1}`)
}
)
user, _, err := client.Users.Get("u")
if err != nil {
t.Errorf("Users.Get returned error: %v", err)
}
want := &User{ID: Int(1)}
if !reflect.DeepEqual(user, want) {
t.Errorf("Users.Get returned %+v, want %+v",
user, want)
}
}
testflight : 一个用于向服务器发出简单 http 请求的包,使用 testflight 和 mux 来制作模拟端点,您将可以进行完美的测试。
例子:
func TestPostWithForm(t *testing.T) {
testflight.WithServer(Handler(), func(r *testflight.Requester) {
response := r.Post("/post/form", testflight.FORM_ENCODED, "name=Drew")
assert.Equal(t, 201, response.StatusCode)
assert.Equal(t, "Drew created", response.Body)
})
}
关于unit-testing - 用于 http 处理程序测试的 Golang 模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885705/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/