Files
samber_cc-skills-golang/skills/golang-samber-do/references/testing.md
T
Samuel BertheandGitHub 26e1d996a7 fix(skills): correctness fixes from REVIEW.md audit (28 files) (#47)
* fix(skills): correctness fixes from REVIEW.md audit

Compile errors:
- golang-samber-do: do.Eager→ProvideValue, do.Scope(root,x)→root.Scope(x), do.ListProvidedServices→injector.ListProvidedServices, do.Clone→injector.Clone
- golang-samber-oops: fix void handler returning error value, replace undefined var r with data in Recover example
- golang-samber-mo: assign fetchUser result before calling Match
- golang-observability: fix Exemplar API (use ExemplarObserver type assertion + ObserveWithExemplar)
- golang-data-structures: RemoveFront/RemoveBack→l.Remove(l.Front())/l.Remove(l.Back())
- golang-database: stats.LatencyCount→stats.WaitDuration.Seconds()

Security / reliability:
- golang-security: scrypt.Key error now handled; remove len() guard from checkToken (ConstantTimeCompare handles it); MaxInt64→MaxInt in safeMultiply; io.EOF→sentinel error in limitedReader; fix malformed 4-sep table header
- golang-concurrency: fix goroutine leak in fanOut (select on <-in and <-ctx.Done together)

Quality:
- golang-dependency-management: fix gsa module path (nicholasgasior→Zxilly/go-size-analyzer)
- golang-samber-slog: Pool() description corrected (load-balance to ONE handler, not broadcast)
- golang-benchmark: b.Elapsed() annotated as b.Loop()-only; b.Loop() contradiction resolved; -seconds=30 moved to URL query param; inline cost budget updated
- golang-performance: simd/archsimd marked as speculative experimental API; cgroup v1 caveat added
- golang-modernize: new(30) clarified (initializes to value, not zero)
- golang-google-wire: type PrimaryDB *sql.DB→struct wrapper (pointer aliases not distinguished by Wire)
- golang-safety: nil slice table column renamed from "Read from nil" to "Index into nil"
- golang-dependency-injection: Wire comment corrected (has cleanup func(), no lifecycle hooks); do.Override→do.OverrideValue
- golang-lint: 33→48 linters; gosec added to NEVER suppress; linter-reference updated with 14 missing linters + Logging category
- golang-spf13-viper: fix reason for "never bind in RunE" (PersistentPreRunE ran first)

* bump patch versions for skills changed in recent PRs
2026-05-19 22:48:45 +02:00

1.4 KiB

Testing with samber/do

Container Cloning

Clone containers for isolated tests:

func TestUserService(t *testing.T) {
    // Create test container by cloning main container
    testInjector := mainInjector.Clone()

    // Override with mocks
    mockDB := &MockDatabase{}
    do.OverrideValue(testInjector, mockDB)

    // Test with mocked dependencies
    service := do.MustInvoke[UserService](testInjector)
    // ... test code
}

Reusable Test Helpers

func SetupTestContainer(t *testing.T) do.Injector {
    injector := do.New()

    do.Provide(injector, func(i do.Injector) (Database, error) {
        return &MockDatabase{}, nil
    })

    return injector
}

Quick Reference

Testing & Overrides

Function Purpose
injector.Clone() Clone container for testing
injector.CloneWithOpts() Clone with custom options
do.Override[T]() Replace service (use in tests)
do.OverrideNamed[T]() Replace named service
do.OverrideValue[T]() Replace value service
do.OverrideNamedValue[T]() Replace named value
do.OverrideTransient[T]() Replace transient factory
do.OverrideNamedTransient[T]() Replace named transient factory