首页 / C# / c# – 在与MOQ相同的接口中模拟方法
c# – 在与MOQ相同的接口中模拟方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在与MOQ相同的接口中模拟方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2517字,纯文字阅读大概需要4分钟。
内容图文
![c# – 在与MOQ相同的接口中模拟方法](/upload/InfoBanner/zyjiaocheng/813/8e4ba2c8382c4bdaa300b9085ad66ec9.jpg)
我有一个服务方法,我想测试.该方法在同一个类中调用另一个方法.这个方法已经过测试,所以我想模仿那个方法.
这是我的设置:
private readonly Mock<INewsLetterRepository> _mockNewsLetterRepository;
private readonly Mock<INewsLetterService> _mockNewsLetterService;
private readonly INewsLetterService _newsLetterService;
public NewsLetterServiceTest()
{
_mockNewsLetterRepository = new Mock<INewsLetterRepository>();
_mockNewsLetterService = new Mock<INewsLetterService> {CallBase = true};
_newsLetterService = new NewsLetterService(_mockNewsLetterRepository.Object);
}
这是我正在使用的测试:
[TestMethod]
public void CreateNewsLetter_Should_Return_Empty_NewsLetter()
{
var template = new Template
{
PlaceHolders = new List<TemplatePlaceholder>()
};
var newsLetter = new NewsLetter {Template = template};
const string content = "<html><body><!--BROWSER--></body></html>";
_mockNewsLetterService.Setup(x => x.BuildNewsLetterHTML(It.IsAny<NewsLetter>())).Returns(content);
var actual = _mockNewsLetterService.Object.CreateNewsLetter(newsLetter);
Assert.AreEqual(content, actual);
}
现在的问题是我正在模拟的函数:BuildNewsLetterHTML返回null而不是它应该返回的内容.
这是我想要测试的函数的简化版本:
public string CreateNewsLetter(NewsLetter newsLetter)
{
var newsletterHTML = BuildNewsLetterHTML(newsLetter);
return newsletterHTML;
}
所以问题是,至少在我看来,我模拟的函数不会返回它应该返回的内容字符串. Assert.AreEqual上的测试失败,因为实际为null.你们中的任何人都知道为什么实际为空?
提前致谢.
解决方法:
似乎问题是你正在调用Mock< T>的CreateNewsLetter方法,该方法尚未设置,并且似乎也是您正在测试的方法.你不应该对你的假货进行测试,它们应该替代生产代码以帮助测试其他代码.
我建议您在这种情况下使用extract and override pattern,因为您希望在具有被测试方法的同一类的方法中导致伪实现.
Moq在某些情况下很棒,但我不认为在情况需要时使用小的可读存根有什么问题.
public class YourTestClass
{
[TestMethod]
public void CreateNewsLetter_Should_Return_Empty_NewsLetter()
{
var template = new Template
{
PlaceHolders = new List<TemplatePlaceholder>()
};
var newsLetter = new NewsLetter { Template = template };
const string content = "<html><body><!--BROWSER--></body></html>";
INewsletterService service = new BuildNewsLetterStub(content);
string actual = service.CreateNewsLetter(newsLetter);
Assert.AreEqual(content, actual);
}
}
public class BuildNewsLetterStub : NewsLetterService
{
private string _letter;
public BuildNewsLetterStub(string letter)
{
_letter = letter;
}
public override string BuildNewsLetterHTML(NewsLetter newsLetter)
{
return _letter;
}
}
要覆盖BuildNewsLetterHTML,必须将其标记为虚拟.
内容总结
以上是互联网集市为您收集整理的c# – 在与MOQ相同的接口中模拟方法全部内容,希望文章能够帮你解决c# – 在与MOQ相同的接口中模拟方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。