mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-01-23 21:13:35 +00:00
implement scope tests
This commit is contained in:
@@ -73,6 +73,120 @@ void main() {
|
|||||||
expect(() => scope.resolve<int>(), throwsA(isA<StateError>()));
|
expect(() => scope.resolve<int>(), throwsA(isA<StateError>()));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
group('Named dependencies', () {
|
||||||
|
test('Resolve named binding', () {
|
||||||
|
final scope = Scope(null)
|
||||||
|
..installModules([
|
||||||
|
TestModule<String>(value: "first"),
|
||||||
|
TestModule<String>(value: "second", name: "special")
|
||||||
|
]);
|
||||||
|
expect(scope.resolve<String>(named: "special"), "second");
|
||||||
|
expect(scope.resolve<String>(), "first");
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Named binding does not clash with unnamed', () {
|
||||||
|
final scope = Scope(null)
|
||||||
|
..installModules([
|
||||||
|
TestModule<String>(value: "foo", name: "bar"),
|
||||||
|
]);
|
||||||
|
expect(() => scope.resolve<String>(), throwsA(isA<StateError>()));
|
||||||
|
expect(scope.resolve<String>(named: "bar"), "foo");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("tryResolve returns null for missing named", () {
|
||||||
|
final scope = Scope(null)
|
||||||
|
..installModules([
|
||||||
|
TestModule<String>(value: "foo"),
|
||||||
|
]);
|
||||||
|
expect(scope.tryResolve<String>(named: "bar"), isNull);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
group('Provider with params', () {
|
||||||
|
test('Resolve dependency using providerWithParams', () {
|
||||||
|
final scope = Scope(null)
|
||||||
|
..installModules([
|
||||||
|
_InlineModule((m, s) {
|
||||||
|
m.bind<int>().toProvideWithParams((param) => (param as int) * 2);
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
expect(scope.resolve<int>(params: 3), 6);
|
||||||
|
expect(
|
||||||
|
() => scope.resolve<int>(),
|
||||||
|
throwsA(isA<StateError>()),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
group('Async resolution', () {
|
||||||
|
test('Resolve async instance', () async {
|
||||||
|
final scope = Scope(null)
|
||||||
|
..installModules([
|
||||||
|
_InlineModule((m, s) {
|
||||||
|
m.bind<String>().toInstanceAsync(Future.value('async value'));
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
expect(await scope.resolveAsync<String>(), "async value");
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Resolve async provider', () async {
|
||||||
|
final scope = Scope(null)
|
||||||
|
..installModules([
|
||||||
|
_InlineModule((m, s) {
|
||||||
|
m.bind<int>().toProvideAsync(() async => 7);
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
expect(await scope.resolveAsync<int>(), 7);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Resolve async provider with param', () async {
|
||||||
|
final scope = Scope(null)
|
||||||
|
..installModules([
|
||||||
|
_InlineModule((m, s) {
|
||||||
|
m.bind<int>().toProvideAsyncWithParams((x) async => (x as int) * 3);
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
expect(await scope.resolveAsync<int>(params: 2), 6);
|
||||||
|
expect(
|
||||||
|
() => scope.resolveAsync<int>(),
|
||||||
|
throwsA(isA<StateError>()),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('tryResolveAsync returns null for missing', () async {
|
||||||
|
final scope = Scope(null);
|
||||||
|
final result = await scope.tryResolveAsync<String>();
|
||||||
|
expect(result, isNull);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
group("Drop modules", () {
|
||||||
|
test("After dropModules resolves fail", () {
|
||||||
|
final scope = Scope(null)..installModules([TestModule<int>(value: 5)]);
|
||||||
|
expect(scope.resolve<int>(), 5);
|
||||||
|
scope.dropModules();
|
||||||
|
expect(() => scope.resolve<int>(), throwsA(isA<StateError>()));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
group("Subscope closing", () {
|
||||||
|
test("closeSubScope removes subscope", () {
|
||||||
|
final scope = Scope(null);
|
||||||
|
final subScope = scope.openSubScope("child");
|
||||||
|
expect(scope.openSubScope("child"), same(subScope));
|
||||||
|
scope.closeSubScope("child");
|
||||||
|
final newSubScope = scope.openSubScope("child");
|
||||||
|
expect(newSubScope, isNot(same(subScope))); // New instance after close
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
group("tryResolve returns null if not found", () {
|
||||||
|
test("Returns null for missing dependency", () {
|
||||||
|
final scope = Scope(null);
|
||||||
|
expect(scope.tryResolve<int>(), isNull);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestModule<T> extends Module {
|
class TestModule<T> extends Module {
|
||||||
@@ -89,3 +203,12 @@ class TestModule<T> extends Module {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Вспомогательный модуль для подстановки builder'а через конструктор
|
||||||
|
class _InlineModule extends Module {
|
||||||
|
final void Function(Module, Scope) _builder;
|
||||||
|
_InlineModule(this._builder);
|
||||||
|
|
||||||
|
@override
|
||||||
|
void builder(Scope s) => _builder(this, s);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user