diff --git a/src/blueapi/core/context.py b/src/blueapi/core/context.py index 26ed8da78..22f8dbcf7 100644 --- a/src/blueapi/core/context.py +++ b/src/blueapi/core/context.py @@ -260,9 +260,13 @@ def __get_pydantic_core_schema__( ) -> CoreSchema: def valid(value): val = self.find_device(value) - if not val or not is_compatible( - val, cls.origin or target, cls.args - ): + if not val: + device_names = list(self.devices.keys()) + raise ValueError( + f"Device {value} cannot be found, " + f"available devices are: {device_names}" + ) + elif not is_compatible(val, cls.origin or target, cls.args): required = qualified_generic_name(target) raise ValueError( f"Device {value} is not of type {required}" diff --git a/tests/unit_tests/worker/test_task_worker.py b/tests/unit_tests/worker/test_task_worker.py index b06e6bc8c..1bfd6dc65 100644 --- a/tests/unit_tests/worker/test_task_worker.py +++ b/tests/unit_tests/worker/test_task_worker.py @@ -636,12 +636,13 @@ def injected_device_plan( assert params["dev"] == fake_device -def test_missing_injected_devices_fail_early( +def test_missing_injected_devices_fail_early_and_give_list_of_known_devices( context: BlueskyContext, ): def missing_injection(dev: FakeDevice = inject("does_not_exist")) -> MsgGenerator: yield from () context.register_plan(missing_injection) - with pytest.raises(ValueError): + with pytest.raises(ValueError) as excinfo: Task(name="missing_injection").prepare_params(context) + assert "fake_device" in str(excinfo.value)