2

我试图嘲笑我的MailController

_mockMailController = new Mock<IMailController>();
_mockMailController.Setup(x => x.ForgotPassword("test@email.com"));

我的控制器IMailController作为依赖项,但是当我打电话时

mailController.ForgotPassword("test@email.com").Deliver();

我得到一个 NullReferenceException (因为ForgotPassword不返回任何东西,我猜)

理想情况下,我们会存根EmailResult?

4

2 回答 2

1

您尚未为从 ForgotPassword 方法返回值的模拟创建设置。使用默认行为,这将返回类型的默认值,在这种情况下为 null。

您可以像这样模拟返回值:

_mockMailController.Setup(x => x.ForgotPassword("test@email.com"))
                   .Returns(new SomeType());
于 2013-05-03T08:01:49.233 回答
1

我为 ActionMailer.Net 创建了一个拉取请求,它引入了一个 IEmailResult 接口,使模拟变得非常容易。看看这个:

https://bitbucket.org/swaj/actionmailer.net/pull-request/4/iemailresult-interface-for-better/

在合并拉取请求之前,您可以使用我的项目中的自定义构建。

https://bitbucket.org/hydr/xv-actionmailer.net

模拟 get 就像写一样简单(使用 FakeItEasy,Moq 可能类似):

//SetUp
_myMailer = A.Fake<IMyMailer>();

//Later on in Assert
A.CallTo(() => _myMailer.MyTestEmail()).MustHaveHappened(Repeated.Exactly.Once);

当 Mailer 被定义为:

public class MailController : MailerBase, IMyMailer
{
    public IEmailResult MyTestEmail()
    {
        To.Add("recipient@sdf.com");
        From = "sender@sdf.com";
        Subject = "Subject";
        return Email();
    }
}
于 2013-05-03T13:31:46.360 回答