gpt4 book ai didi

c# - 覆盖先前设置的 Typemock 隔离器的功能行为 (WillThrow()/DoInstead())

转载 作者:行者123 更新时间:2023-11-30 16:29:12 25 4
gpt4 key购买 nike

请查看这段代码:

        public UserRepository GetUserRepositoryMock()
{
// mock all UserRepository instances.
var userRepositoryMock = Isolate.Fake.Instance<UserRepository>();
Isolate.Swap.AllInstances<UserRepository>().With(userRepositoryMock);

// make all public UserRepository members throw a NotSupportedException.
Isolate.WhenCalled(() => userRepositoryMock.Select(null)).WillThrow(new NotSupportedException());
Isolate.WhenCalled(() => userRepositoryMock.SelectOne(null)).WillThrow(new NotSupportedException());
Isolate.WhenCalled(() => userRepositoryMock.Save(null)).WillThrow(new NotSupportedException());
Isolate.WhenCalled(() => userRepositoryMock.Remove(null)).WillThrow(new NotSupportedException());
// ... et cetera until all public members of UserRepository will throw NotSupportedException.
}

[TestMethod]
public void ActivateUser_UserNotFound_ThrowsException()
{
var userRepositoryMock = GetUserRepositoryMock();

// override one of the public UserRepository members to return a specific value.
Isolate.WhenCalled(() => userRepositoryMock.SelectOne(null)).DoInstead(context =>
{
return null;
});

// call ActivateUser implementation.
RegistrationServices.ActivateUser("foo@bar.com", "password", "activation-code");
}

这段代码实际上做的是为 UserRepository 的所有公共(public)成员抛出 NotSupportedException。

这段代码我想要做的是让 UserRepository 的所有公共(public)成员抛出一个 NotSupportedException除了 SelectOne() 函数,它返回 null

我想确保 RegistrationServicesActivateUser() 函数不会调用 UserRepository 的任何函数, SelectOne() 我明确指定的函数。

如果是,例如通过更改 ActivateUser() 的实现来调用 UserRepositorySave() 和不改变相应的 *ActivateUser_UserNotFound_ThrowsException* 测试,我希望测试失败,因为更改可能会引入意外行为。这样我就可以将我的应用程序与第三方完全隔离并将编码错误减少到最低限度。

关于这段代码及其背后的原则,我的问题是:

  1. 我怎样才能实现预期的行为?
  2. 我可以探索任何替代方案来实现所需的行为吗?
  3. 所需行为的基本原则是否有效? 即我是否应该出于测试目的将整个应用程序与第三方隔离开来,在调用未预料到的函数时引发异常,并且仅在明确指定时才返回有效数据?

最佳答案

注意:我在 Typemock 工作

您可以在此处采用多种方法来测试您想要的内容。例如,您可以使用 Isolate.Verify用于确保没有对您的假对象进行特定调用的 API。

这将允许您不明确指定其他方法的返回,因为您可以确保它们没有发生:

    [Test, Isolated]
public void ActivateUser_UserNotFound_ThrowsException()
{
var userRepositoryMock = Isolate.Fake.Instance<UserRepository>();
Isolate.Swap.AllInstances<UserRepository>().With(userRepositoryMock);

Isolate.WhenCalled(() => userRepositoryMock.SelectOne(null)).WillReturn(null);

// call ActivateUser implementation.
RegistrationServices.ActivateUser("foo@bar.com", "password", "activation-code");

Isolate.Verify.WasNotCalled(() => userRepositoryMock.Save(null));
Isolate.Verify.WasNotCalled(() => userRepositoryMock.Remove(null));
}

Isolator 的 WhenCalled() 以定义的顺序链接方法行为,这意味着在您的原始测试中,第一次 SelectOne 会抛出异常,第二次会抛出异常它将返回 null

希望对您有所帮助,如果您有其他问题,请随时通过支持或此处联系我们!

关于c# - 覆盖先前设置的 Typemock 隔离器的功能行为 (WillThrow()/DoInstead()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6507825/

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