gpt4 book ai didi

c# - FakeItEasy:从返回 null 的 protected 方法获取参数

转载 作者:太空宇宙 更新时间:2023-11-03 21:29:02 24 4
gpt4 key购买 nike

我正在尝试测试在 protected 虚方法中传递的参数,以确保属性设置正确。然而,下面的语句没有设置我的变量,但 FakeItEasy 确实识别出正在进行此调用。我的语法不正确吗?

单元测试

EmailEventArgs argsInEvent = null;

A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.Invokes(i => argsInEvent = i.GetArgument<EmailEventArgs>(0))
.MustHaveHappened(Repeated.Exactly.Once);

存储库中的方法

private void onSaveSetupEmailArgs(string callerName, int pk)
{
EmailEventArgs args = new EmailEventArgs();

// ..set property logic

OnSaveRequest(args); // the protected virtual method
}

最佳答案

如果不进行整个测试,很难判断发生了什么。典型的测试模式是:

  1. 造假
  2. 配置假对象以设置参数的捕获
  3. 执行应该使用伪造的生产代码,并且
  4. 然后验证是否已调用电话。

我看不到你在哪里打电话生产代码,但你的 A.CallTo 似乎都在尝试配置方法并验证是否进行了调用。自从你说 MustHaveHappened 通过,我猜这段代码在调用生产代码后仍然存在。像这样的东西:

var repository = A.Fake<IRepository>();

repository.SaveSetup(…);

EmailEventArgs argsInEvent = null;

A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.Invokes(i => argsInEvent = i.GetArgument<EmailEventArgs>(0))
.MustHaveHappened(Repeated.Exactly.Once);

这将不起作用(当然你知道,否则你不会问问题)因为你正在配置 Invokes after 生产代码有已经运行(并且 OnSaveRequest 调用已经在假的上进行)。

你应该有这样的东西:

// Arrange
EmailEventArgs argsInEvent = null;

var repository = A.Fake<IRepository>();

A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.Invokes(i => argsInEvent = i.GetArgument<EmailEventArgs>(0));

// Act
repository.SaveSetup(…);

// Assert
A.CallTo(repository).Where(w => w.Method.Name == "OnSaveRequest")
.MustHaveHappened(Repeated.Exactly.Once);

// and maybe do something with argsInEvent

关于c# - FakeItEasy:从返回 null 的 protected 方法获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25187930/

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