オートマッパーを使用し、Domain
とService
の2つのレイヤーを持つこのコードベースがあります。それぞれに、データ表現用のオブジェクトDomainItem
とServiceItem
があります。サービスはドメインからデータを取得し、コンストラクターが挿入したautomapperインスタンスを使用してマッピングします
class Service
{
public ServiceItem Get(int id)
{
var domainItem = this.domain.Get(id);
return this.mapper.Map<DomainItem, ServiceItem>(domainItem);
}
}
ベストプラクティスを想定しているため、マッパーには副作用や外部依存関係はありません。フィールドをマッピングするだけで、あるオブジェクトを数秒以内に別のオブジェクトに変換する静的関数を作成します。
これを念頭に置いて、このような単体テストでマッパーをモックするのは良い習慣ですか?
[TestClass]
class UnitTests
{
[TestMethod]
public void Test()
{
var expected = new ServiceItem();
var mockDomain = new Mock<IDomain>();
// ... setup
var mockMapper = new Mock<IMapper>();
mockMapper.Setup(x => x.Map<DomainItem, ServiceItem>(It.IsAny<DomainItem>()))
.Returns(expected);
var service = new Service(mockDomain.Object, mockMapper.Object);
var result = service.Get(0);
Assert.AreEqual(expected, result);
}
}
私には、そのようなユニットテストはモックだけを効果的にテストしているので、実際には何の価値ももたらさないようです。したがって、私はそれをまったく書かないでしょうOR私は嘲笑されたマッパーではなく、実際のマッパーです。私は正しいですか、それとも何かを見落としていますか?
ここでの問題は、テストが実際に達成しようとしていること、つまりService.Get()
のテストに対して正しく記述されていないことだと思います。
このテストの書き方は次のとおりです。
_[TestMethod]
public void Test()
{
var expected = new ServiceItem();
var mockDomain = new Mock<IDomain>();
var expectedDomainReturn = new DomainItem(0); //Illustrative purposes only
mockDomain.Setup(x => x.DomainCall(0)).Returns(expectedDomainReturn); //Illustrative purposes only
var mockMapper = new Mock<IMapper>();
mockMapper.Setup(x => x.Map<DomainItem, ServiceItem>(It.IsAny<DomainItem>()))
.Returns(expected);
var service = new Service(mockDomain.Object, mockMapper.Object);
var result = service.Get(0);
mockDomain.Verify(x => x.DomainCall(0), Times.Once);
mockMapper.Verify(x => x.Map<DomainItem, ServiceItem>(expectedDomainReturn), Times.Once);
}
_
このテストでは、service.Get()
の機能を実際にチェックするのではなく、渡されたパラメーターが応答に基づいて個々の依存関係の呼び出しに対して正しいことを確認します。したがって、AutoMapper
自体をテストしていないので、テストする必要はありません。
result
をチェックすることは基本的に役に立たないが、コードカバレッジを上げるだろう。