标签: moq

你如何使用Moq来模拟一个简单的界面?

好的,我有一个像这样的业务逻辑类:

注意:对于上下文,供应商简报是描述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)

c# unit-testing dependency-injection moq mocking

32
推荐指数
1
解决办法
4万
查看次数

如何模拟非虚拟方法?

[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方法必须是虚拟的才能模拟它.有没有办法模拟非虚拟方法?

.net c# moq

32
推荐指数
4
解决办法
3万
查看次数

如果我可以定义变量,为什么要使用It.is <>或It.IsAny <>?

嗨,当我看到这段代码时,我一直在使用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?

对不起,我不确定我的问题是否正确,或者我是否缺少一些测试知识.但似乎两种方式都没有错.

c# testing unit-testing moq mocking

32
推荐指数
2
解决办法
3万
查看次数

如何测试asp.net核心内置的Ilogger

我想验证记录的一些日志.我使用的是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

那么,如何验证记录的日志?

c# logging unit-testing moq asp.net-core

32
推荐指数
3
解决办法
7139
查看次数

如何使用Moq模拟对具体对象的函数调用?

我怎么能在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').

有任何想法吗?

tdd unit-testing moq mocking

31
推荐指数
2
解决办法
3万
查看次数

使用Moq"短路"无效方法?

我的团队最近决定使用Moq作为我们的模拟框架,因为它具有极大的灵活性和高度可读的语法.由于我们刚接触它,我在看似简单的问题上磕磕绊绊 - 搜索(这里,谷歌等)找到了关于Moq其他细微差别的大量讨论,但不一定是我所追求的,以及一些看似相关的问题变成了红色的鲱鱼.

我们正在测试一个具有外部依赖关系的类(确切地说是Amazon SimpleDb)但不希望我们的测试绑定到实时连接.一种特殊的方法:

  • 应用一些"业务"逻辑
  • 如果合适,通过我们建立的提供商调用SDB呼叫,让我们称之为 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)

c# methods unit-testing moq mocking

30
推荐指数
1
解决办法
1万
查看次数

Moq并抛出一个SqlException

我有以下代码来测试,当某个名称传递给我的方法时,它会抛出一个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和另一个,如果它是任何其他异常.这就是我的单元测试正在测试的内容.

有没有办法实现这一点,既没有改变我正在测试的方法的逻辑,或没有测试这种情况?

.net c# unit-testing moq mocking

30
推荐指数
3
解决办法
1万
查看次数

我如何模拟User.Identity.GetUserId()?

我正在尝试对我的代码进行单元测试,其中包括以下行:

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未被用户代码处理".

任何有关我如何进行的帮助将不胜感激.谢谢.

.net c# unit-testing moq asp.net-mvc-5

30
推荐指数
3
解决办法
2万
查看次数

Moq.Mock <T> - 如何设置一个表达式的方法

我正在模拟我的存储库接口,我不知道如何设置一个接受表达式并返回一个对象的方法?我正在使用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)

c# nunit unit-testing moq

29
推荐指数
2
解决办法
2万
查看次数

使用Moq.It.IsAny测试字符串以某事开始

是否可以使用Moq来说一个方法接受一个以"ABC"开头的字符串.

举个例子:

logger.Verify(x => x.WriteData(Moq.It.IsAny<string>().StartsWith("ABC")), Times.Exactly(3));
Run Code Online (Sandbox Code Playgroud)

那不会编译,但希望它说明了我的观点

.net c# unit-testing moq

29
推荐指数
2
解决办法
1万
查看次数