mirror of
https://github.com/samber/cc-skills-golang.git
synced 2026-09-11 19:46:44 +03:00
* 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
1.4 KiB
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 |