标签: moq

你能帮我理解Moq Callback吗?

使用Moq并查看Callback但我无法找到一个简单的例子来了解如何使用它.

你有一个小的工作片段,清楚地解释了如何以及何时使用它?

.net moq

90
推荐指数
4
解决办法
7万
查看次数

在单元测试中模拟HttpClient

我有一些问题试图包装我的代码用于单元测试.问题是这样的.我有接口IHttpHandler:

public interface IHttpHandler
{
    HttpClient client { get; }
}
Run Code Online (Sandbox Code Playgroud)

而使用它的类,HttpHandler:

public class HttpHandler : IHttpHandler
{
    public HttpClient client
    {
        get
        {
            return new HttpClient();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后是Connection类,它使用simpleIOC来注入客户端实现:

public class Connection
{
    private IHttpHandler _httpClient;

    public Connection(IHttpHandler httpClient)
    {
        _httpClient = httpClient;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个单元测试项目,有这个类:

private IHttpHandler _httpClient;

[TestMethod]
public void TestMockConnection()
{
    var client = new Connection(_httpClient);

    client.doSomething();  

    // Here I want to somehow create a mock instance of the http client
    // Instead of the …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq

90
推荐指数
15
解决办法
7万
查看次数

如何使用Moq框架模拟ModelState.IsValid?

我正在检查 ModelState.IsValid我的控制器操作方法,它创建一个像这样的员工:

[HttpPost]
public virtual ActionResult Create(EmployeeForm employeeForm)
{
    if (this.ModelState.IsValid)
    {
        IEmployee employee = this._uiFactoryInstance.Map(employeeForm);
        employee.Save();
    }

    // Etc.
}
Run Code Online (Sandbox Code Playgroud)

我想在使用Moq Framework的单元测试方法中模拟它.我试着像这样嘲笑它:

var modelState = new Mock<ModelStateDictionary>();
modelState.Setup(m => m.IsValid).Returns(true);
Run Code Online (Sandbox Code Playgroud)

但是这在我的单元测试用例中抛出异常.有人可以帮我从这里出去吗?

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

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

当构造函数具有参数时,使用Moq模拟对象

我有一个对象,我正在尝试使用moq进行模拟.对象的构造函数具有必需参数:

public class CustomerSyncEngine {
    public CustomerSyncEngine(ILoggingProvider loggingProvider, 
                              ICrmProvider crmProvider, 
                              ICacheProvider cacheProvider) { ... }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试使用moq的v3"setup"或v4"Mock.Of"语法为这个对象创建模拟但是无法解决这个...我正在尝试的一切都没有验证.这是我到目前为止所拥有的,但最后一行是给我一个真实的对象,而不是模拟.我这样做的原因是因为我想要验证的CustomerSyncEngine上有方法被调用...

// setup
var mockCrm = Mock.Of<ICrmProvider>(x => x.GetPickLists() == crmPickLists);
var mockCache = Mock.Of<ICacheProvider>(x => x.GetPickLists() == cachePickLists);
var mockLogger = Mock.Of<ILoggingProvider>();

// need to mock the following, not create a real class like this...
var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache);
Run Code Online (Sandbox Code Playgroud)

moq

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

如何在ASP.NET Core中使用ILogger进行单元测试

这是我的控制器:

public class BlogController : Controller
{
    private IDAO<Blog> _blogDAO;
    private readonly ILogger<BlogController> _logger;

    public BlogController(ILogger<BlogController> logger, IDAO<Blog> blogDAO)
    {
        this._blogDAO = blogDAO;
        this._logger = logger;
    }
    public IActionResult Index()
    {
        var blogs = this._blogDAO.GetMany();
        this._logger.LogInformation("Index page say hello", new object[0]);
        return View(blogs);
    }
}
Run Code Online (Sandbox Code Playgroud)

如你所见,我有2个依赖项,a IDAO和aILogger

这是我的测试类,我使用xUnit来测试和Moq来创建mock和stub,我可以DAO轻松模拟,但是ILogger我不知道该怎么做所以我只是传递null并注释掉调用登录控制器当跑步测试.有没有办法测试,但仍然以某种方式保持记录器?

public class BlogControllerTest
{
    [Fact]
    public void Index_ReturnAViewResult_WithAListOfBlog()
    {
        var mockRepo = new Mock<IDAO<Blog>>();
        mockRepo.Setup(repo => repo.GetMany(null)).Returns(GetListBlog());
        var controller = new BlogController(null,mockRepo.Object);

        var result = controller.Index(); …
Run Code Online (Sandbox Code Playgroud)

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

81
推荐指数
10
解决办法
4万
查看次数

如何使用Moq模拟扩展方法?

我正在编写一个依赖于扩展方法结果的测试,但我不希望该扩展方法的未来失败会破坏此测试.模拟这个结果似乎是显而易见的选择,但是Moq似乎没有提供一种覆盖静态方法的方法(扩展方法的要求).与Moq.Protected和Moq.Stub有类似的想法,但它们似乎没有为这种情况提供任何东西.我错过了什么或者我应该以不同的方式去做这件事吗?

这是一个简单的例子,通常会对"不可覆盖的成员的无效期望"失败.这是需要模拟扩展方法的一个不好的例子,但它应该这样做.

public class SomeType {
    int Id { get; set; }
}

var ListMock = new Mock<List<SomeType>>();
ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5))
        .Returns(new SomeType { Id = 5 });
Run Code Online (Sandbox Code Playgroud)

至于任何可能建议我使用Isolator的TypeMock迷们:我很欣赏这项努力,因为看起来TypeMock可能会被蒙住眼睛和醉酒,但我们的预算不会很快增加.

c# extension-methods moq mocking

79
推荐指数
4
解决办法
6万
查看次数

Moq,SetupGet,嘲弄一个属性

我正在尝试模拟一个名为的类,UserInputEntity它包含一个名为的属性ColumnNames:(它确实包含其他属性,我只是将其简化为问题)

namespace CsvImporter.Entity
{
    public interface IUserInputEntity
    {
        List<String> ColumnNames { get; set; }
    }

    public class UserInputEntity : IUserInputEntity
    {
        public UserInputEntity(List<String> columnNameInputs)
        {
            ColumnNames = columnNameInputs;
        }

        public List<String> ColumnNames { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个演示者课程:

namespace CsvImporter.UserInterface
{
    public interface IMainPresenterHelper
    {
        //...
    }

    public class MainPresenterHelper:IMainPresenterHelper
    {
        //....
    }

    public class MainPresenter
    {
        UserInputEntity inputs;

        IFileDialog _dialog;
        IMainForm _view;
        IMainPresenterHelper _helper;

        public MainPresenter(IMainForm view, IFileDialog dialog, IMainPresenterHelper helper)
        {
            _view = …
Run Code Online (Sandbox Code Playgroud)

c# properties moq c#-4.0

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

如何MOQ索引属性

我试图模拟对索引属性的调用.即我想moq以下:

object result = myDictionaryCollection["SomeKeyValue"];
Run Code Online (Sandbox Code Playgroud)

以及设定值

myDictionaryCollection["SomeKeyValue"] = myNewValue;
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我需要模拟我的应用程序使用的类的功能.

有谁知道如何用MOQ做到这一点?我尝试过以下变化:

Dictionary<string, object> MyContainer = new Dictionary<string, object>();
mock.ExpectGet<object>( p => p[It.IsAny<string>()]).Returns(MyContainer[(string s)]);
Run Code Online (Sandbox Code Playgroud)

但那不编译.

我想用MOQ实现的目标是什么,有没有人有任何我可以做到这一点的例子?

c# tdd moq mocking

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

如何在需要进行模拟和单元测试时抛出SqlException?

我试图在我的项目中测试一些异常,并且我遇到的一个例外是SQlException.

看来你不能new SqlException()这样做我不知道怎么能抛出一个异常,特别是没有以某种方式调用数据库(因为这些是单元测试,通常建议不要调用数据库,因为它很慢).

我正在使用NUnit和Moq,但我不确定如何伪造这个.

回应一些似乎都基于ADO.NET的答案,请注意我使用的是Linq to Sql.这样的东西就像在幕后.

根据@MattHamilton的要求提供更多信息:

System.ArgumentException : Type to mock must be an interface or an abstract or non-sealed class.       
  at Moq.Mock`1.CheckParameters()
  at Moq.Mock`1..ctor(MockBehavior behavior, Object[] args)
  at Moq.Mock`1..ctor(MockBehavior behavior)
  at Moq.Mock`1..ctor()
Run Code Online (Sandbox Code Playgroud)

在尝试模型时发布到第一行

 var ex = new Mock<System.Data.SqlClient.SqlException>();
 ex.SetupGet(e => e.Message).Returns("Exception message");
Run Code Online (Sandbox Code Playgroud)

.net asp.net-mvc moq sqlexception

72
推荐指数
7
解决办法
5万
查看次数

Moq验证对象参数

我正在尝试验证一个类的参数.正在测试的代码很好.该错误正在测试中.

我尝试过两种方法,都失败了.

以下是我的尝试:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));
Run Code Online (Sandbox Code Playgroud)

即使作为第二个参数传递的对象具有相同的属性,这也总是失败.第一个参数验证正常.

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );
Run Code Online (Sandbox Code Playgroud)

这总是通过,即使它应该失败.回调中的Asserts确实失败了,但是异常没有传递给外部上下文,因此测试总是通过.

你能帮我找到我做错的事吗?

.net c# unit-testing moq

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