使用Moq并查看Callback但我无法找到一个简单的例子来了解如何使用它.
你有一个小的工作片段,清楚地解释了如何以及何时使用它?
我有一些问题试图包装我的代码用于单元测试.问题是这样的.我有接口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) 我正在检查 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)
但是这在我的单元测试用例中抛出异常.有人可以帮我从这里出去吗?
我有一个对象,我正在尝试使用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) 这是我的控制器:
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) 我正在编写一个依赖于扩展方法结果的测试,但我不希望该扩展方法的未来失败会破坏此测试.模拟这个结果似乎是显而易见的选择,但是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可能会被蒙住眼睛和醉酒,但我们的预算不会很快增加.
我正在尝试模拟一个名为的类,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) 我试图模拟对索引属性的调用.即我想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实现的目标是什么,有没有人有任何我可以做到这一点的例子?
我试图在我的项目中测试一些异常,并且我遇到的一个例外是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) 我正在尝试验证一个类的参数.正在测试的代码很好.该错误正在测试中.
我尝试过两种方法,都失败了.
以下是我的尝试:
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确实失败了,但是异常没有传递给外部上下文,因此测试总是通过.
你能帮我找到我做错的事吗?
moq ×10
c# ×7
unit-testing ×4
.net ×3
mocking ×3
asp.net-mvc ×2
asp.net-core ×1
c#-4.0 ×1
ilogger ×1
properties ×1
sqlexception ×1
tdd ×1