【发布时间】:2023-04-05 15:29:01
【问题描述】:
我正在使用 Moq 框架进行单元测试,并且我最近编写了一个测试来检查我的一个 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 属性的设置,我需要向 Player 添加一个 IPlayer 接口。 然后我会让 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”。
或者,有没有更好的方法来测试这个?
【问题讨论】:
标签: .net unit-testing moq