好的,我有一个像这样的业务逻辑类:
注意:对于上下文,供应商简报是描述PDF文档"下载"的简单实体.
/// <summary>
/// Houses business level functions for dealing with vendor briefs.
/// </summary>
public class VendorBriefController : IVendorBriefController
{
/// <summary>
/// Vendor brief controller requires an instance of IVendorBriefRepository.
/// </summary>
IVendorBriefRepository _vendorBriefRepository;
/// <summary>
/// Initializes an instance of VendorBriefController.
/// </summary>
public VendorBriefController(IVendorBriefRepository vendorBriefRepository)
{
_vendorBriefRepository = vendorBriefRepository;
}
/// <summary>
/// Get a list of string filters for vendor briefs.
/// </summary>
/// <returns>A list of string filters.</returns>
public dynamic GetFilters()
{
List<string> …Run Code Online (Sandbox Code Playgroud) [TestMethod]
public void TestMethod1()
{
var mock = new Mock<EmailService>();
mock.Setup(x => x.SendEmail()).Returns(true);
var cus = new Customer();
var result = cus.AddCustomer(mock.Object);
Assert.IsTrue(result);
}
public class Customer
{
public bool AddCustomer(EmailService emailService)
{
emailService.SendEmail();
Debug.WriteLine("new customer added");
return true;
}
}
public class EmailService
{
public virtual bool SendEmail()
{
throw new Exception("send email failed cuz bla bla bla");
}
}
Run Code Online (Sandbox Code Playgroud)
该EmailService.SendEmail方法必须是虚拟的才能模拟它.有没有办法模拟非虚拟方法?
嗨,当我看到这段代码时,我一直在使用moq.
我必须在我的一个回购中设置一个回报.
mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(),
It.IsAny<Guid>())).Returns(ReturnSomething);
Run Code Online (Sandbox Code Playgroud)
我有三个参数,我只是在网上的一篇文章或博客中看到过这些参数.
It.Is <>或It.IsAny <>对象的用途是什么?如果我可以使用Guid.NewGuid()或其他类型,那么为什么要使用It.Is?
对不起,我不确定我的问题是否正确,或者我是否缺少一些测试知识.但似乎两种方式都没有错.
我想验证记录的一些日志.我使用的是asp.net核心内置的ILogger,并使用asp.net内核的DI注入它:
private readonly ILogger<InvoiceApi> _logger;
public InvoiceApi(ILogger<InvoiceApi> logger)
{
_logger = logger;
}
Run Code Online (Sandbox Code Playgroud)
然后我用它像: _logger.LogError("error));
我像往常一样通过以下方式嘲笑它(使用moq):
MockLogger = new Mock<ILogger<InvoiceApi>>();
Run Code Online (Sandbox Code Playgroud)
并将其注入服务中以供测试:
new InvoiceApi(MockLogger.Object);
Run Code Online (Sandbox Code Playgroud)
然后尝试验证:
MockLogger.Verify(m => m.LogError(It.Is<string>(s => s.Contains("CreateInvoiceFailed"))));
Run Code Online (Sandbox Code Playgroud)
但它抛出:
对非虚拟(在VB中可覆盖)成员的验证无效:m => m.LogError
那么,如何验证记录的日志?
我怎么能在Moq做到这一点?
Foo bar = new Foo();
Fake(bar.PrivateGetter).Return('whatever value')
Run Code Online (Sandbox Code Playgroud)
我似乎只能找到如何模拟通过框架创建的对象.我想在我创建的具体对象上只模拟一个方法/属性.
在TypeMock中,我会这样做Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value').
有任何想法吗?
我的团队最近决定使用Moq作为我们的模拟框架,因为它具有极大的灵活性和高度可读的语法.由于我们刚接触它,我在看似简单的问题上磕磕绊绊 - 搜索(这里,谷歌等)找到了关于Moq其他细微差别的大量讨论,但不一定是我所追求的,以及一些看似相关的问题变成了红色的鲱鱼.
我们正在测试一个具有外部依赖关系的类(确切地说是Amazon SimpleDb)但不希望我们的测试绑定到实时连接.一种特殊的方法:
SaveItem()我想对这进行单元测试,以便我们设置所需的上下文并确保SaveItem()调用它,但是以一种SaveItem()真正未被调用的方式(因为A)SDB的提供者是一个没有完全补充的模拟器,并且可能会炸弹和B)我不想为这笔交易付出数十万次).
在处理返回值的方法时,这很简单.
mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo");
Run Code Online (Sandbox Code Playgroud)
在我概述的情况下,我的" SaveItem()"方法是无效的,因此使用Moq Returns()方法的选项不可用.虽然我可以设置一个回调来验证是否SaveItem()被调用,但我似乎无法让它实际上没有做任何事情.
天真/充满希望,我认为以下内容可行,但似乎仍然会调用该方法:
mockDb.Setup(d => d.SaveItem(It.IsAny<object>()));
Run Code Online (Sandbox Code Playgroud)
所以百万美元的问题:以下虚构代码的Moq是什么?
mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE();
Run Code Online (Sandbox Code Playgroud) 我有以下代码来测试,当某个名称传递给我的方法时,它会抛出一个SQL异常(有理由那个,虽然听起来有点奇怪).
mockAccountDAL.Setup(m => m.CreateAccount(It.IsAny<string>(),
"Display Name 2", It.IsAny<string>())).Throws<SqlException>();
Run Code Online (Sandbox Code Playgroud)
但是,这不会编译,因为SqlException的构造函数是内部的:
'System.Data.SqlClient.SqlException'必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法'Moq.Language.IThrows.Throws()'中将其用作参数'TException'
现在,我可以更改它以声明它应该抛出Exception,但这对我不起作用,因为我的方法应该返回一个状态代码,如果它是a SqlException和另一个,如果它是任何其他异常.这就是我的单元测试正在测试的内容.
有没有办法实现这一点,既没有改变我正在测试的方法的逻辑,或没有测试这种情况?
我正在尝试对我的代码进行单元测试,其中包括以下行:
UserLoginInfo userIdentity = UserManager.GetLogins(User.Identity.GetUserId()).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
因为我无法得到,我只是被困在一点上:
User.Identity.GetUserId()
Run Code Online (Sandbox Code Playgroud)
返回一个值.我一直在设置控制器时尝试以下操作:
var mock = new Mock<ControllerContext>();
mock.Setup(p => p.HttpContext.User.Identity.GetUserId()).Returns("string");
Run Code Online (Sandbox Code Playgroud)
但是它给出了"NotSupportedException未被用户代码处理"的错误.我也尝试过以下方法:
ControllerContext controllerContext = new ControllerContext();
string username = "username";
string userid = Guid.NewGuid().ToString("N"); //could be a constant
List<Claim> claims = new List<Claim>{
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", username),
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", userid)
};
var genericIdentity = new GenericIdentity("Andrew");
genericIdentity.AddClaims(claims);
var genericPrincipal = new GenericPrincipal(genericIdentity, new string[] { });
controllerContext.HttpContext.User = genericPrincipal;
Run Code Online (Sandbox Code Playgroud)
基于我在stackoverflow上找到的一些代码,但这会返回相同的错误"NotSupportedException未被用户代码处理".
任何有关我如何进行的帮助将不胜感激.谢谢.
我正在模拟我的存储库接口,我不知道如何设置一个接受表达式并返回一个对象的方法?我正在使用Moq和NUnit
接口:
public interface IReadOnlyRepository : IDisposable
{
IQueryable<T> All<T>() where T : class;
T Single<T>(Expression<Func<T, bool>> expression) where T : class;
}
Run Code Online (Sandbox Code Playgroud)
使用IQueryable进行测试已经设置,但不知道如何设置T Single:
private Moq.Mock<IReadOnlyRepository> _mockRepos;
private AdminController _controller;
[SetUp]
public void SetUp()
{
var allPages = new List<Page>();
for (var i = 0; i < 10; i++)
{
allPages.Add(new Page { Id = i, Title = "Page Title " + i, Slug = "Page-Title-" + i, Content = "Page " + i + " on page content." …Run Code Online (Sandbox Code Playgroud) 是否可以使用Moq来说一个方法接受一个以"ABC"开头的字符串.
举个例子:
logger.Verify(x => x.WriteData(Moq.It.IsAny<string>().StartsWith("ABC")), Times.Exactly(3));
Run Code Online (Sandbox Code Playgroud)
那不会编译,但希望它说明了我的观点