unit-testing - 如何验证在单独的 go 例程中调用了一个方法

标签 unit-testing go testify

在为一个方法编写单元测试时,我遇到了一个问题。首先是被测代码片段:

func MehodToBeTested(e Entity) {
  go saveAudit(e)

 //do something on which assertions can be done
}

实体可以被模拟。在 saveAudit 方法中,调用了 Entity.Save 方法。在我的 UT 中,我想断言 Entity.Save 方法被调用一次。以下是我当前的 UT:

func TestMethod(t *testing.T) {
  var mock = &mockEntity{}
  mock.On("Save").Return(nil)

  //make call to func under test
  MethodToBeTested(mock)

  // Assert that Save is called on Entity
  mock.AssertNumberOfCalls(t, "Save",1)
}

这是错误提示:预期调用次数 (1) 与实际调用次数 (0) 不匹配,因为实际调用发生在另一个 go 例程中。我该如何测试?

最佳答案

我使用相同的技术。等待 goroutine 结束。很可能还没有设置。

此外,我建议使用竞争条件检测器运行此类测试。它有助于捕捉这种情况。然后您可以向测试添加一些同步以使其可靠。

我的测试示例。被测试的函数应该并行检查两个网页是否包含指定的字符串。所以测试应该检查测试函数是否访问了两个页面

更新:附加了不正确的测试。固定的。

func TestCheckSites_TwoSlowHandlers_BothContain(t *testing.T) {
    var config = GetConfig()
    var v1, v2 bool
    var wg sync.WaitGroup
    wg.Add(2)
    handler1 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer wg.Done()
        v1 = true
        time.Sleep(2 * config.Http.Timeout) // Use double HTTP_TIMEOUT
        io.WriteString(w, "Present")
    })
    ts1 := httptest.NewServer(handler1)
    defer ts1.Close()

    handler2 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer wg.Done()
        v2 = true
        time.Sleep(2 * config.Http.Timeout)
        io.WriteString(w, "Present")
    })
    ts2 := httptest.NewServer(handler2)
    defer ts2.Close()

    result, err := checkSites([]string{ts1.URL, ts2.URL}, "Present")
    assert.Equal(t, nil, err, "Error should be nil")
    assert.Contains(t, []string{""}, result, "Should be empty string")
    //assert.(t, ts1.URL, result, "Should first or second empty string")
    wg.Wait()
    assert.Equal(t, true, v1, "First server should be visited")
    assert.Equal(t, true, v2, "Second server should be visited")
}

关于unit-testing - 如何验证在单独的 go 例程中调用了一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47466952/

相关文章:

python - 如何对 Django View 进行单元测试?

unit-testing - LAMP Web 应用程序的测试建议

java - 如何在反射的私有(private)方法上模拟自动连线的私有(private)响应

go - YAML Unmarshal map [string] struct

go - 如何接收 testify 框架 "assert"方法中的方法返回的多个值作为参数?

c# - 使用最小起订量模拟具有泛型参数的类型

arrays - 有没有更好的方法来处理可变大小的 slice ?

mysql - 将空接口(interface)转换为字符串

unit-testing - 如何在golang中的for循环中模拟相同的输入和不同的返回值

unit-testing - 带模拟的测试套件。无法使用struct方法