标签: moq

模拟Asp.net-mvc控制器上下文

因此控制器上下文取决于一些asp.net内部.有什么方法可以干净地模拟这些单元测试?当我只需要例如Request.HttpMethod来返回"GET"时,似乎很容易堵塞大量设置的测试.

我在网上看过一些例子/助手,但有些已经过时了.认为这将是保持最新和最伟大的好地方.

我正在使用最新版本的犀牛嘲笑

asp.net-mvc unit-testing rhino-mocks moq mocking

68
推荐指数
5
解决办法
4万
查看次数

Moq +单元测试 - System.Reflection.TargetParameterCountException:参数计数不匹配

我想使用带有多参数函数的lambda,但是当我尝试调用该行时,Moq会在运行时抛出此异常mock.Object.Convert(value, null, null, null);.

System.Reflection.TargetParameterCountException: Parameter count mismatch

代码是:

var mock = new Mock<IValueConverter>();

mock.Setup(conv => conv.Convert(It.IsAny<Object>(), It.IsAny<Type>(),
    It.IsAny<Object>(), It.IsAny<CultureInfo>())).Returns((Int32 num) => num + 5);

var value = 5;
var expected = 10;
var actual = mock.Object.Convert(value, null, null, null);
Run Code Online (Sandbox Code Playgroud)

实施它的正确方法是什么?

c# wpf unit-testing moq ivalueconverter

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

Multiple Moq It.Is <string>()匹配参数

使用Moq,拥有多个匹配参数是否有效?

It.Is<string>() 
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我希望mockMembershipService根据用户提供的内容返回不同的ProviderUserKey.

mockMembershipService.Setup(
    x => x.GetUser(
      It.Is<string>(
        s => s.Contains("Joe")))
   .ProviderUserKey)
.Returns("1234abcd");


mockMembershipService.Setup(
  x => x.GetUser(
    It.Is<string>(
      s => s.Contains("Tracy")))
  .ProviderUserKey)
.Returns("5678efgh");
Run Code Online (Sandbox Code Playgroud)

SetUp默认为第二个语句,而不是根据它自己的优点来评估每个语句.

c# unit-testing moq mocking

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

MOQ - 如何模拟需要转换为另一个接口的接口?

我想要做的是为I1构建一个moq - 这很好......但是在我测试的方法过程中使用这个模拟我需要将它转换为I2才能访问一些不在的属性I1

Interface I1 
{ int AProperty{get;set;}}

Interface I2
{int AnotherProperty{get;set;}}
Run Code Online (Sandbox Code Playgroud)

然后我有一些对象

Class O1 : I1 {}
Run Code Online (Sandbox Code Playgroud)

Class O2 : O1 , I2 {}
Run Code Online (Sandbox Code Playgroud)

问题是,当我有一个I2实现对象的实例时,我可以将它转换为I1,以便访问通过该接口实现的方法.在代码中,这不是问题,并且每个标志都按预期工作.

在该类上编写单元测试时,唯一的问题就出现了.

接口还公开了一个名为GetNewInstance的方法,该方法返回一个初始化的实现对象实例,该实例对象被转换为IGetNewInstance接口...我通常可以模拟这个并使其自行返回(因此我继续使用模拟对象).

但是,当您尝试将此类型I2的返回对象转换为I1时,将引用空引用 - 这是有意义的,因为实现I2的模拟对象不会从继承I1的任何内容继承.

问题是我如何强制模拟对象同时从I1和I2继承?

inheritance unit-testing interface moq

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

模拟静态方法

最近,我开始使用Moq进行单元测试.我使用Moq来模拟我不需要测试的类.

你通常如何处理静态方法?

public void foo(string filePath)
{
    File f = StaticClass.GetFile(filePath);
}
Run Code Online (Sandbox Code Playgroud)

怎么可能这个静态方法StaticClass.GetFile()被嘲笑?

PS我很欣赏你推荐的Moq和单元测试的任何阅读材料.

c# unit-testing moq mocking

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

moq对象返回方法,应该返回一个null对象

我正在开发一个Web API,我想出的一个测试是,如果客户端使用物理测试ID进行GET操作(物理测试是我正在寻找的资源)并且找不到物理测试,Web API应返回404状态.

现在,我正在使用moq框架进行测试,我有以下代码:

[TestMethod]
public void then_if_physical_test_not_found_return_not_found_status()
{
    var unitOfWork = new Mock<IUnitOfWork>();
    var repository = new Mock<IRepository<PhysicalTest>>();
    repository.Setup(r => r.FindById(It.IsAny<int>())).Returns();
    unitOfWork.Setup(m => m.PhysicalTests).Returns(repository.Object);
    var pt = new PhysicalTestResource(unitOfWork.Object);
    HttpResponseMessage<PhysicalTest> response = pt.GetPhysicalTest(43);
    Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode)
}
Run Code Online (Sandbox Code Playgroud)

我需要Returns()方法来返回一个null对象,如果找不到资源,它将是实际API方法返回的对象.

我尝试在Returns()方法中将null作为参数发送但没有成功.

c# moq mocking asp.net-mvc-3 wcf-web-api

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

是否可以模拟.NET HttpWebResponse?

我有一个集成测试,从第三方服务器获取一些json结果.它非常简单,效果很好.

我希望停止实际点击这个服务器并使用Moq(或任何Mocking库,如ninject等)来劫持并强制返回结果.

这可能吗?

以下是一些示例代码: -

public Foo GoGetSomeJsonForMePleaseKThxBai()
{
    // prep stuff ...

    // Now get json please.
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("Http://some.fancypants.site/api/hiThere);
    httpWebRequest.Method = WebRequestMethods.Http.Get;

    string responseText;

    using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
    {
        using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream()))
        {
            json = streamReader.ReadToEnd().ToLowerInvariant();
        }
    }

    // Check the value of the json... etc..
}
Run Code Online (Sandbox Code Playgroud)

当然,这个方法是从我的测试中调用的.

我在想,也许我需要传递给这个方法(或类的属性?)一个嘲笑httpWebResponse或者什么,但是不太确定这是不是这样.此外,响应是httpWebRequest.GetResponse()方法的输出..所以也许我只需要传入一个模拟HttpWebRequest

任何带有示例代码的建议都会得到最多的评价!

.net c# unit-testing moq mocking

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

在Moq Callback()调用中设置变量值

我想我可能对Moq Callback方法的语法有点困惑.当我尝试做这样的事情时:

IFilter filter = new Filter();
List<IFoo> objects = new List<IFoo> { new Foo(), new Foo() };  

IQueryable myFilteredFoos = null;
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
   .Callback( (IFilter filter) => myFilteredFoos = filter.FilterCollection(objects))
   .Returns(myFilteredFoos.Cast<IFooBar>());
Run Code Online (Sandbox Code Playgroud)

这会引发异常,因为myFilteredFoosCast<IFooBar>()调用期间为null .这不符合我的预期吗?我认为FilterCollection会被调用,然后myFilteredFoos将是非null并允许演员.

FilterCollection是不是能够返回一个null,它使我得出它没有被调用的结论.另外,当我这样声明时myFilteredFoos:

Queryable myFilteredFoos;
Run Code Online (Sandbox Code Playgroud)

Return调用抱怨myFilteredFoos可以在初始化之前使用.

.net c# unit-testing moq mocking

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

使用moq仅模拟一些方法

我有以下方法:

public CustomObect MyMethod()
{
    var lUser = GetCurrentUser();
    if (lUser.HaveAccess)
    {
        //One behavior
    }
    else 
    {
        //Other behavior
    }

    //return CustomObject
}
Run Code Online (Sandbox Code Playgroud)

我想要模拟IMyInterface.GetCurrentUser,以便在调用时MyMethod我可以访问其中一个代码路径来检查它.如何用Moq做到这一点?

我正在做以下事情:

var moq = new Mock<IMyInterface>();            
moq.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);

//act
var lResult = moq.Object.MyMethod();
Run Code Online (Sandbox Code Playgroud)

但由于某些原因lResult总是null,当我试图进入MyMethod调试时,我总是跳到下一个声明.

moq

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

如何使用Entity Framework Core模拟异步存储库

我正在尝试为调用异步存储库的类创建单元测试.我正在使用ASP.NET Core和Entity Framework Core.我的通用存储库看起来像这样.

public class EntityRepository<TEntity> : IEntityRepository<TEntity> where TEntity : class
{
    private readonly SaasDispatcherDbContext _dbContext;
    private readonly DbSet<TEntity> _dbSet;

    public EntityRepository(SaasDispatcherDbContext dbContext)
    {
        _dbContext = dbContext;
        _dbSet = dbContext.Set<TEntity>();
    }

    public virtual IQueryable<TEntity> GetAll()
    {
        return _dbSet;
    }

    public virtual async Task<TEntity> FindByIdAsync(int id)
    {
        return await _dbSet.FindAsync(id);
    }

    public virtual IQueryable<TEntity> FindBy(Expression<Func<TEntity, bool>> predicate)
    {
        return _dbSet.Where(predicate);
    }

    public virtual void Add(TEntity entity)
    {
        _dbSet.Add(entity);
    }
    public virtual void Delete(TEntity entity)
    {
        _dbSet.Remove(entity);
    }

    public virtual …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq entity-framework-core asp.net-core

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