PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
课程与章节
源码索引 / CURRENT IMPLEMENTATION

learning/go-patterns/stages/03-errors-tests/main_test.go

51 行 · 点击行号可定位;函数链接随声明位置更新,不手填行号。

跳到函数 / 声明
package main

import (
	"errors"
	"strings"
	"testing"
)

type errorSource struct {
	err error
}

func (s errorSource) Lookup(string) (Price, error) {
	return Price{}, s.err
}

func TestQuoteWrapsUnknownItem(t *testing.T) {
	service := NewService(Catalog{})

	_, err := service.Quote("book")
	if err == nil {
		t.Fatal("Quote returned nil error")
	}
	if !errors.Is(err, ErrUnknownItem) {
		t.Fatalf("errors.Is(%v, ErrUnknownItem) = false", err)
	}
	if !strings.Contains(err.Error(), `quote "book"`) {
		t.Fatalf("error %q does not contain operation context", err)
	}
}

func TestQuotePreservesAnInjectedCause(t *testing.T) {
	service := NewService(errorSource{err: ErrSourceUnavailable})

	_, err := service.Quote("book")
	if !errors.Is(err, ErrSourceUnavailable) {
		t.Fatalf("errors.Is(%v, ErrSourceUnavailable) = false", err)
	}
}

func TestQuoteReturnsPriceWithoutAnError(t *testing.T) {
	service := NewService(Catalog{"book": {Item: "book", Cents: 2100}})

	got, err := service.Quote("book")
	if err != nil {
		t.Fatalf("Quote returned error: %v", err)
	}
	if got.Cents != 2100 {
		t.Fatalf("Quote returned %#v", got)
	}
}