モデル リポジトリをテストして、メッセージ バスを呼び出すかどうかを確認していました。これが良いテストであるかどうかはわかりませんが、私の考えは次のとおりです。通常はbus.sendをコントローラーに入れます(これはMVC Webアプリです)が、特にコントローラーをテストしたくないのでロジック、これをリポジトリに移動しました。私の場合、コントローラーは単純です。リポジトリは、バスとモデル データベースを使用してビュー モデルを構築します。
とにかく、この問題のポイントは、私が実行している moq テストです。バスをモックして、それがリポジトリから呼び出されていることを確認したかったのです。
テストは次のようになります。
public class when_creating_new_clinic
{
Establish context = () =>
{
clinicID = Guid.NewGuid();
model = new ClinicModel
{
ClinicID = clinicID,
Alias = "alias",
Title = "title"
// stuff omitted
};
newClinicData = new NewClinicData
{
ClinicID = clinicID,
Alias = "alias",
Title = "title"
// stuff omitted
};
cmd = new CreateClinicCmd(newClinicData);
bus = new Mock<IMessageBusAgent>();
repository = new ClinicModelRepository(bus.Object);
bus.Setup(b => b.Send(cmd));
};
Because it = () => repository.Create(model);
It should_send_create_clinic_command_to_bus = () =>
{
bus.Verify(b => b.Send(cmd), Times.Exactly(1));
};
static ClinicModelRepository repository;
static ClinicModel model;
static Mock<IMessageBusAgent> bus;
static NewClinicData newClinicData;
static Guid clinicID;
static CreateClinicCmd cmd;
}
リポジトリの要点は次のとおりです。
public class ClinicModelRepository : IClinicModelRepository
{
private readonly IMessageBusAgent m_bus;
public ClinicModelRepository(IMessageBusAgent bus)
: this()
{
m_bus = bus;
}
public void Create(ClinicModel clinicModel)
{
// stuff omitted (data is mapped from clinicModel)
m_bus.Send(new CreateClinicCmd(data));
}
}
IMessageBusAgent は次のように宣言されます。
public interface IMessageBusAgent : IDomainCommandSender, IDomainEventPublisher, IUnitOfWork
{
}
テストの結果は次のようになります。
when creating new clinic
» create Clinic コマンドをバスに送信する必要があります (FAIL)
テスト「クリニック作成コマンドをバスに送信する必要があります」が失敗しました: Moq.MockException: モックでの呼び出しが正確に 1 回期待されていましたが、0 回でした: b => b.Send(when_creating_new_clinic.cmd)
Configured setups:
b => b.Send<CreateClinicCmd>(when_creating_new_clinic.cmd), Times.Never
Performed invocations:
IDomainCommandSender.Send(ArReg.Commands.CreateClinicCmd)
IUnitOfWork.Commit()
at Moq.Mock.ThrowVerifyException(MethodCall expected, IEnumerable`1 setups, IEnumerable`1 actualCalls, Expression expression, Times times, Int32 callCount)
at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times)
at Moq.Mock.Verify[T](Mock mock, Expression`1 expression, Times times, String failMessage)
at Moq.Mock`1.Verify(Expression`1 expression, Times times)
Repositories\when_creating_new_clinic.cs(51,0): at ArReg.Tests.Specs.Repositories.when_creating_new_clinic.<.ctor>b__4()
at Machine.Specifications.Model.Specification.InvokeSpecificationField()
at Machine.Specifications.Model.Specification.Verify()
0 パス、1 失敗、0 スキップ、3.58 秒かかりました (Machine.Specifications 0.4.24-f7fb6b5)。
Send() コマンドは IDomainCommandSender で宣言されていますが、正しい呼び出しを確認するには、どのようにテストをセットアップする必要がありますか?
ありがとう