gpt4 book ai didi

c# - 使用 Machine.Specs 使用 MVC MailerBase 测试类时出错

转载 作者:行者123 更新时间:2023-11-30 21:56:55 24 4
gpt4 key购买 nike

当我尝试测试正在调用另一个继承自 MVC 的类 (NotificationMailer) 的类 (FindTask) 时,我收到错误消息>MailerBase.

System.ArgumentNullException: Value cannot be null. Parameter name: httpContext

class FindTask
{
public void Find()
{
notificationMailer.Notify("Some message").Send();
}
}

我正在尝试验证 FindTask 是否调用了 NotificationMailer::Notify

public class NotificationMailer : MailerBase, INotificationMailer
{
public NotificationMailer()
{
MasterName = "_Layout";
}

public virtual MvcMailMessage Notify(string message)
{
return Populate(x =>
{
x.Subject = "Some Notification";
x.ViewName = "Notify";
x.To.Add("testEmail@test.com");
x.Body = message;
});
}
}

错误在 return Populate(...) 行。

public class FindTaskSpec : WithSubject<FindTask>
{
Establish context = () =>
{
MvcMailMessage mailMessage = new MvcMailMessage();
The<INotificationMailer>()
.WhenToldTo(x => x.Notify(Param<string>.IsAnything))
.Return(mailMessage);
};

Because of = () => Subject.Find();
}

public class when_something_is_found : FindTaskSpec
{
It should_send_an_email_with_the_found_stuff = () => The<IDeadLinkMailer>()
.WasToldTo(x => x.Notify(Param<string>.IsAnything))
.OnlyOnce();
}

我认为 Establish context(模拟)中的行应该规定如果调用 Notify,它应该返回一个新的 MVCMailMessage 而无需运行函数体。

我的问题:

  1. 如何解决此错误并进行测试以确保调用了 Notify 方法?

  2. 为什么Notify的mock没有阻止测试进入notify的函数体?

附带说明一下,我已经尝试设置 MailerBase.IsTestModeEnabled = true。这会导致 Url 错误 - Invalid Url: The Url is Empty;

我已通读 their wiki page on setting up tests for MvcMailer .

我还阅读了关于此的几乎所有其他堆栈溢出页面。我认为 this链接是最有帮助的。问题是我不知道如何在 Machine.Specifications 的链接中模仿他们所做的事情。

如果我可以为链接中显示的任一方法创建模拟,我想我的问题就会得到解决。

最佳答案

我认为在这种情况下,我很想创建一个 FakeNotificationMailer 类,方法是从 NotificationMailer 派生并覆盖 Notify 方法,并且让它返回预构建的 MvcMailMessage。这与您的模拟所做的基本相同,但一切都是明确的。像这样的东西:

public class FakeNotificationMailer : MailerBase, INotificationMailer
{
MvcMailMessage preBuiltMessage;
public NotificationMailer(MvcMailMessage result)
{
preBuiltMessage = result;
}

public virtual MvcMailMessage Notify(string message)
{
return preBuiltMessage;
}
}

(我在弄清楚你的依赖项是什么时遇到了问题,所以这有点摸不着头脑)。

当然,你必须找到可以注入(inject)你的假实现的地方(依赖倒置原则)。

关于c# - 使用 Machine.Specs 使用 MVC MailerBase 测试类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31078576/

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