@@ -333,9 +333,15 @@ def build_user_factory_with_admin_trait(trait_name)
333
333
end
334
334
end
335
335
336
+ expected_message = [
337
+ "Trait not registered: \" inaccessible_trait\" ." ,
338
+ "Registered traits: []." ,
339
+ "Referenced within \" user\" definition"
340
+ ] . join ( " " )
341
+
336
342
expect { FactoryBot . build ( :user ) } . to raise_error (
337
343
KeyError ,
338
- 'Trait not registered: "inaccessible_trait" referenced within "user" definition'
344
+ expected_message
339
345
)
340
346
end
341
347
@@ -370,14 +376,233 @@ def build_user_factory_with_admin_trait(trait_name)
370
376
end
371
377
end
372
378
379
+ expected_message = [
380
+ "Trait not registered: \" inaccessible_trait\" ." ,
381
+ "Registered traits: [:admin]." ,
382
+ "Referenced within \" admin\" definition"
383
+ ] . join ( " " )
384
+
373
385
expect { FactoryBot . build ( :user , :admin ) } . to raise_error (
374
386
KeyError ,
375
- 'Trait not registered: "inaccessible_trait" referenced within "admin" definition'
387
+ expected_message
376
388
)
377
389
end
378
390
end
379
391
end
380
392
393
+ describe "trait exception error messages" do
394
+ before { define_model ( "User" , name : :string ) }
395
+
396
+ context "when a missing trait is defined within the factory" do
397
+ it "includes the definition name where the missing trait was called" do
398
+ FactoryBot . define do
399
+ factory :user do
400
+ inaccessible_trait
401
+ end
402
+ end
403
+
404
+ expect { FactoryBot . build ( :user ) } . to raise_error (
405
+ KeyError ,
406
+ /Referenced within "user" definition/
407
+ )
408
+ end
409
+ end
410
+
411
+ context "when a missing trait is called by the user" do
412
+ it "excludes the factory definition name" do
413
+ FactoryBot . define do
414
+ factory :user
415
+ end
416
+
417
+ expect { FactoryBot . build ( :user , :missing_trait ) } . to raise_error ( KeyError ) do |error |
418
+ expect ( error . message ) . not_to include "Referenced within \" user\" definition"
419
+ end
420
+ end
421
+ end
422
+
423
+ context "when no defined traits" do
424
+ context "includes an empty list" do
425
+ it "when the factory references a missing trait internally" do
426
+ FactoryBot . define do
427
+ factory :user do
428
+ inaccessible_trait
429
+ end
430
+ end
431
+
432
+ expect { FactoryBot . build ( :user ) } . to raise_error (
433
+ KeyError ,
434
+ /Registered traits: \[ \] /
435
+ )
436
+ end
437
+
438
+ it "when a missing trait is called by the user" do
439
+ FactoryBot . define do
440
+ factory :user
441
+ end
442
+
443
+ expect { FactoryBot . build ( :user , :missing_trait ) } . to raise_error (
444
+ KeyError ,
445
+ "Trait not registered: \" missing_trait\" . Registered traits: []"
446
+ )
447
+ end
448
+ end
449
+ end
450
+
451
+ context "with a single defined trait" do
452
+ context "includes a list if the single trait" do
453
+ it "when the factory references a missing trait internally" do
454
+ FactoryBot . define do
455
+ factory :user do
456
+ trait :trait_1
457
+
458
+ inaccessible_trait
459
+ end
460
+ end
461
+
462
+ expected_message = [
463
+ "Trait not registered: \" inaccessible_trait\" ." ,
464
+ "Registered traits: [:trait_1]." ,
465
+ "Referenced within \" user\" definition"
466
+ ] . join ( " " )
467
+
468
+ expect { FactoryBot . build ( :user ) } . to raise_error (
469
+ KeyError ,
470
+ expected_message
471
+ )
472
+ end
473
+
474
+ it "when a missing trait is called by the user" do
475
+ FactoryBot . define do
476
+ factory :user do
477
+ trait :trait_1
478
+ end
479
+ end
480
+
481
+ expect { FactoryBot . build ( :user , :missing_trait ) } . to raise_error (
482
+ KeyError ,
483
+ "Trait not registered: \" missing_trait\" . Registered traits: [:trait_1]"
484
+ )
485
+ end
486
+ end
487
+ end
488
+
489
+ context "with multiple defined traits" do
490
+ context "includes a list of all traits" do
491
+ it "when the factory references a missing trait internally" do
492
+ FactoryBot . define do
493
+ factory :user do
494
+ trait :trait_1
495
+ trait :trait_2
496
+ trait :trait_3
497
+ trait :trait_4
498
+
499
+ inaccessible_trait
500
+ end
501
+ end
502
+
503
+ expected_message = [
504
+ "Trait not registered: \" inaccessible_trait\" ." ,
505
+ "Registered traits: [:trait_1, :trait_2, :trait_3, :trait_4]." ,
506
+ "Referenced within \" user\" definition"
507
+ ] . join ( " " )
508
+
509
+ expect { FactoryBot . build ( :user ) } . to raise_error (
510
+ KeyError ,
511
+ expected_message
512
+ )
513
+ end
514
+
515
+ it "when a missing trait is called by the user" do
516
+ FactoryBot . define do
517
+ factory :user do
518
+ trait :trait_1
519
+ trait :trait_2
520
+ trait :trait_3
521
+ trait :trait_4
522
+ end
523
+ end
524
+
525
+ expected_message = [
526
+ "Trait not registered: \" missing_trait\" ." ,
527
+ "Registered traits: [:trait_1, :trait_2, :trait_3, :trait_4]"
528
+ ] . join ( " " )
529
+
530
+ expect { FactoryBot . build ( :user , :missing_trait ) } . to raise_error (
531
+ KeyError ,
532
+ expected_message
533
+ )
534
+ end
535
+ end
536
+ end
537
+
538
+ context "with both defined and inherited traits" do
539
+ context "includes a list of all traits" do
540
+ it "when the factory references a missing trait internally" do
541
+ FactoryBot . define do
542
+ factory :user do
543
+ trait :user_trait_1
544
+ trait :user_trait_2
545
+
546
+ factory :admin do
547
+ trait :admin_trait_1
548
+ trait :admin_trait_2
549
+
550
+ factory :dev do
551
+ trait :dev_trait_1
552
+ trait :dev_trait_2
553
+
554
+ inaccessible_trait
555
+ end
556
+ end
557
+ end
558
+ end
559
+
560
+ expected_message = [
561
+ "Trait not registered: \" inaccessible_trait\" ." ,
562
+ "Registered traits: [:admin_trait_1, :admin_trait_2," ,
563
+ ":dev_trait_1, :dev_trait_2, :user_trait_1, :user_trait_2]." ,
564
+ "Referenced within \" dev\" definition"
565
+ ] . join ( " " )
566
+
567
+ expect { FactoryBot . build ( :dev ) } . to raise_error (
568
+ KeyError ,
569
+ expected_message
570
+ )
571
+ end
572
+
573
+ it "when a missing trait is called by the user" do
574
+ FactoryBot . define do
575
+ factory :user do
576
+ trait :user_trait_1
577
+ trait :user_trait_2
578
+
579
+ factory :admin do
580
+ trait :admin_trait_1
581
+ trait :admin_trait_2
582
+
583
+ factory :dev do
584
+ trait :dev_trait_1
585
+ trait :dev_trait_2
586
+ end
587
+ end
588
+ end
589
+ end
590
+
591
+ expected_message = [
592
+ "Trait not registered: \" missing_trait\" ." ,
593
+ "Registered traits: [:admin_trait_1, :admin_trait_2," ,
594
+ ":dev_trait_1, :dev_trait_2, :user_trait_1, :user_trait_2]"
595
+ ] . join ( " " )
596
+
597
+ expect { FactoryBot . build ( :dev , :missing_trait ) } . to raise_error (
598
+ KeyError ,
599
+ expected_message
600
+ )
601
+ end
602
+ end
603
+ end
604
+ end
605
+
381
606
describe "traits with callbacks" do
382
607
before do
383
608
define_model ( "User" , name : :string )
0 commit comments