gpt4 book ai didi

unit-testing - Moq - 如何对方法中的引用进行单元测试更改

转载 作者:行者123 更新时间:2023-12-04 07:08:22 24 4
gpt4 key购买 nike

改天,另一个问题。我的服务层有以下方法

public MatchViewData CreateMatch(string user)
{
var matchViewData = !HasReachedMaxNumberOfMatchesLimit(user) ?
CreateMatchAndAddToRepository(user) :
MatchViewData.NewInstance(new Match(user));

matchViewData.LimitReached = HasReachedMaxNumberOfMatchesLimit(user);
return matchViewData;
}

该方法调用 this 辅助方法来创建一个新的匹配对象:
private MatchViewData CreateMatchAndAddToRepository(string user)
{
var match = new Match(user);
MatchRepository.Add(match);
return MatchViewData.NewInstance(match);
}

存储库存储给定的匹配对象并将 id 设置为某个值 > 0。
public void Add(Match match)
{
Check.Require(match != null);
var numberOfMatchesBefore = Matches.Count;
SetIdPerReflection(match, NextVal());
Matches.Add(match);
Check.Ensure(numberOfMatchesBefore == Matches.Count - 1);
}

matchviewdata 对象复制匹配对象的一些属性(包括 id)。

我的单元测试应该验证服务中生成的 viewdata 对象的 id > 0。为了实现这一点,我必须模拟存储库和 add 方法的行为。但是 service 方法每次被调用时都会创建一个新的 match 对象,并且存储库上的 add 方法更新引用的 match 对象(不需要返回值)。我不知道用最小起订量解决这个问题。

到目前为止,这是我的单元测试:
[Test]
public void ServiceCreateMatchReturnedMatchViewDataHasNonZeroId()
{
var match = TestUtils.FakePersistentMatch(User, 1);
var repositoryMock = new Mock<IMatchRepository>();
repositoryMock.Setup(
r => r.Add(It.IsAny<Match>())).Callback(() => match.Id = 1);
var serviceFacade = new DefaultServiceFacade(repositoryMock.Object);

var returnedMatch = serviceFacade.CreateMatch(User);

Assert.That(returnedMatch.Id, Is.GreaterThan(0));
}

我尝试了一些其他变体 - 没有任何效果。

最佳答案

在我看来,您的问题出在这一行;

repositoryMock.Setup(
r => r.Add(It.IsAny<Match>())).Callback(() => match.Id = 1);

您在这里实际做的是设置您在测试中声明的第一个匹配对象的 id,而不是在您的服务中创建的新匹配。

因为 Match您将提供给存储库的对象是在内部创建的,我想不出一种简单的方法来在您的 Test 方法中引用它来为其设置回调。对我来说,这是一个迹象,你可能试图在一个单元测试中测试太多。

我认为您应该简单地测试 Add 方法是否被调用并编写一个单独的测试以确保它按预期工作。

我提出这样的建议;
[Test]
public void ServiceAddsNewMatchToRepository()
{
var repositoryMock = new Mock<IMatchRepository>();
bool addCalled = false;
repositoryMock
.Expect(r => r.Add(It.Is<Match>(x => x.Id == 0))
.Callback(() => addCalled = true);

var serviceFacade = new DefaultServiceFacade(repositoryMock.Object);
serviceFacade.CreateMatch(User);

Assert.True(addCalled);
}

....

[Test]
public void AddingANewMatchGeneratesANewId()
{
var match = new Match(user);
var matchRepository = new MatchRepository();
var returnedMatch = matchRepository.Add(match);

Assert.That(returnedMatch.Id, Is.GreaterThan(0));
}

关于unit-testing - Moq - 如何对方法中的引用进行单元测试更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/762167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com