Skip to content

Instantly share code, notes, and snippets.

View csmith0651's full-sized avatar

Craig Smith csmith0651

  • Arlington, MA
View GitHub Profile
@csmith0651
csmith0651 / test_error.go
Created October 18, 2016 12:15
prime a mock call to return an error and test for it
Context("simulate an error retrieving data from S3", func() {
var testCall *gomock.Call
BeforeEach(func() {
testCall = mockFetcher.EXPECT().GetObject(gomock.Any()).Return(nil, fmt.Errorf("AWS error")).AnyTimes()
})
It("and fails", func() {
_, err := ReadPersonFromS3(mockFetcher)
Expect(err).To(HaveOccurred())
testCall.Times(1)
})
@csmith0651
csmith0651 / mock_testcall.go
Last active October 17, 2016 20:17
example of registering a mock call on the mock object.
Context("ReadPersonFromS3 -- using mock", func() {
bucket := "testbucket"
key := "persondata.txt"
objectInput := &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}
goodObjectOutput := &s3.GetObjectOutput{
Body: S3Fetcher.NewMockBody([]byte(goodJson)),
}
@csmith0651
csmith0651 / mock_controller.go
Last active October 17, 2016 20:12
example of a creating a mock controller for you test suite.
var _ = Describe("Person", func() {
var (
mockFetcher *mock_S3Fetcher.MockS3Fetcher
ctrl *gomock.Controller
)
BeforeEach(func() {
ctrl = gomock.NewController(GinkgoT())
})
AfterEach(func() {
ctrl.Finish()
@csmith0651
csmith0651 / mock_import.go
Created October 17, 2016 20:06
updating the import list to include the generated mock object
import (
"github.com/tapjoy/gomockblog/mocks/mock_s3fetcher"
}
var svc S3Fetcher.S3Fetcher
var err error
var jsonData string = goodJson
JustBeforeEach(func() {
svc, err = S3Fetcher.NewStringFetcher(jsonData)
})
Context("ReadPersonFromS3", func() {
It("successfully reads data from S3", func() {
@csmith0651
csmith0651 / person_test.go
Last active October 18, 2016 12:58
person_test
package person_test
import (
. "github.com/tapjoy/mocks3fetcher/person"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("person", func() {
goodJson := `
func downloadS3Data(fetcher S3Fetcher, bucket string, key string) ([]byte, error) {
results, err := fetcher.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
return nil, err
}
defer results.Body.Close()
type MockBody struct {
buf *bytes.Buffer
}
func (m MockBody) Close() error {
return nil
}
func (m MockBody) Read(p []byte) (n int, err error) {
return m.buf.Read(p)
func (fetcher *fileFetcher) GetObject(s3Input *s3.GetObjectInput) (*s3.GetObjectOutput, error) {
// completely ignore the input, just return an object wrapping the fetcher.data
log.Printf("reading offers from file '%s'", fetcher.file)
return &s3.GetObjectOutput{
Body: *(NewMockBody(fetcher.data)),
}, nil
}
type fileFetcher struct {
data []byte
file string
}
func NewFileFetcher(filename string) (S3Fetcher, error) {
// read contents of file
jsonBuff, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err