我为我的单元测试使用了Moq框架,最近我写了一个测试来检查我的DTO中的某个属性是否在方法中设置。什么时候在DTO模型上使用接口?
原来,DTO是由我的方法返回....然后属性设置。 以下是我正在测试的方法。
public void UpdatePlayerProfileStatistics(DataRow playerRecord, bool useUpdatedGamesPlayed = true)
{
DTOProfile.Player player = this._playerDataParser.ParsePlayerProfileData(playerRecord);
DTOProfile.Player playerInDatabase = this._playerManager.MatchPlayerInDatabase(player.Id);
string errorMessage = String.Empty;
if (useUpdatedGamesPlayed)
{
// do nothing. player.Games = player.Games; nothing changes
}
else
{
// we want to keep the Games played from the value of the player in the database.
player.Games = playerInDatabase.Games;
}
if (!this.repository.UpdatePlayerProfile(player, out errorMessage))
{
throw new InvalidOperationException(errorMessage);
}
}
对于我的测试,我会嘲笑ParsePlayerProfileData和MatchPlayerInDatabase,但测试.Games属性的设置,我需要一个IP层接口添加到播放器。 然后,我会让ParsePlayerProfileData和MatchPlayerInDatabase返回接口。
DTOProfile.IPlayer player = this._playerDataParser.ParsePlayerProfileData(playerRecord);
DTOProfile.IPlayer playerInDatabase = this._playerManager.MatchPlayerInDatabase(player.Id);
然后在我的测试中,我有: -
var mockUpdatedPlayer = new Mock<IPlayer>();
var mockDatabasePlayer = new Mock<IPlayer>();
_playerDataParser.Setup(p => p.ParsePlayerProfileData(It.IsAny<DataRow>())).Returns(mockUpdatedPlayer.Object);
_playerManager.Setup(m => m.MatchPlayerInDatabase(It.IsAny<int>())).Returns(mockDatabasePlayer.Object);
UpdatePlayerProfileStatistics(myRow, true);
mockedPlayer.VerifySet(x => x.Games = It.IsAny<int>(), Times.Never());
这一切工作。
我的问题是,我应该为所有DTO提供接口,并让所有方法返回这些接口(而不是具体类型)? 我想这将允许我执行这些'VerifySet'和'VerifyGet's。
或者,有没有更好的方法来测试呢?
呀,设计气味正是我所指的是。我喜欢使用VerifySet和VerifyGet方法的想法....但是为了使用它们而必须转换大量代码库才能使我不满意。 我喜欢虚拟属性的想法。我会试试看看是否可以缓解我的一些担忧。 –