Recuperar novo objeto da associação, não da classe

Ao testar, você pode fazer algo como:

@user.make_widget
expect
(Widget.last.color).to eql Widget.DEFAULT_COLOR

Não. Pode haver algum motivo pelo qual o novo widget não é o “último”, como se a ordem de classificação padrão dos Widgets não fosse cronológica e houvesse outros Widgets existentes. (Sim, um teste deve começar com um banco de dados limpo, mas em um projeto recente eu tive que executar testes que foram limpos por transação e testes que foram limpos por truncamento no mesmo banco de dados. O último teste truncado deixaria seu lixo o banco de dados.) Em vez disso, teste:

@user.make_widget
expect
(@user.widgets.last.color).to eql Widget.DEFAULT_COLOR

Dessa forma, widgets preexistentes não devem interferir, se você se esqueceu de começar com um banco de dados limpo.