标签: moq

使用Moq模拟带有Func <T,bool>参数的存储库调用

我正在尝试使用Moq来模拟我的某些存储库调用,并且我产生的大多数单元测试都运行良好,但是我遇到了无法正确模拟的情况。

需要模拟的我的存储库调用具有以下签名:

IEnumerable<T> Get(
    Expression<Func<T, bool>> filter = null, 
    Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, 
    string includeProperties = "");
Run Code Online (Sandbox Code Playgroud)

我正在进行单元测试的方法如下:

public bool CheckForTaskUsage(int taskId)
{
    return _taskInstanceRepository.Get(x => x.Task.Id == taskId).Any();
}
Run Code Online (Sandbox Code Playgroud)

单元测试如下:

Task task_1 = new Task() { Id = 1 };
TaskInstance taskInstance_1 = new TaskInstance() { Id = 1, Task = task_1 };
_domainTaskInstances = new List<TaskInstance>() { taskInstance_1 };

[TestMethod()]
public void TaskService_CheckForTaskUsage_Success()
{
    int taskId = 1;
    //_taskInstanceRepository.Setup(x => x.Get(y => y.Task.Id == taskId,null,""))
    //    .Returns(_domainTaskInstances); …
Run Code Online (Sandbox Code Playgroud)

c# moq mocking

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

如何模拟一个执行复杂实体框架LINQ查询的对象?

我正在尝试为一个简单的mvc控制器编写单元测试,该控制器对数据库进行复杂的LINQ查询:

public class HomeController
{
    private readonly DamagesDbContext db;

    public HomeController(DamagesDbContext db)
    {
        this.db = db;
    }

    // GET: /Home/
    [Authorize]
    public ActionResult Index()
    {
        var dashData = (from inc_c in db.incident_content
                       join inc in db.incidents
                       on inc_c.incidentid equals inc.incidentid
                       where inc.currentrevisionnumber == inc_c.revisionnumber
                       group inc_c by 1 into g
                       select new{
                           total = g.Count(),
                           open = g.Count(q => q.incidentstatus == "OPEN"),
                           closed = g.Count(q => q.incidentstatus == "CLOSED")
                       }).SingleOrDefault();

        ViewBag.total = dashData.total;
        ViewBag.open = dashData.open;
        ViewBag.closed = dashData.closed;            

        return …
Run Code Online (Sandbox Code Playgroud)

c# linq unit-testing entity-framework moq

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

模拟由函数调用的函数,您将进行单元测试.使用moq

例如,您正在测试getSomeString.

public class Class1
{
    public Class1() {}

    public string getSomeString(string input)
    {
        //dosomething

        OtherClass class = new OtherClass();

        return class.getData();
    }
}

public class OtherClass
{
    public OtherClass() {/*some data*/}    

    public string getData()
    {
        //do something

        string aString = getAString(Input);

        //do something
    }

    public virtual string getAString(string input);
    {
        //do something to be mocked
        return somethingToBeMocked;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你需要单元测试来模拟出来getAString.你怎么做到这一点?

我试过只是模拟getAString并希望测试使用模拟值,但这不起作用.

我试过模拟Class1并将单元测试设置为class1模拟对象,但我无法弄清楚如何使模拟getAString传递给模拟class1.

我无法弄清楚该怎么做.

c# unit-testing moq

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

如何使用Moq模拟输出参数?

我有一个我正在测试的课程.此类使用接口中的take作为构造函数参数.此接口具有一个具有out参数的方法.

我想要做的是模拟这个方法,以便out参数始终是一个特定的值.

如何才能做到这一点?

.net moq

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

在Moq中,给定对.Object的引用,是否可以操作原始模拟?

我希望有可能.Object通过Moq中的扩展方法操作模拟,但我没有找到任何适用的扩展方法.

例如:

interface IFoo
{
    void Bar();
}

/* ... */

var mock = Mock<IFoo>();
mock.Verify(x => x.Bar());

IFoo foo = mock.Object;
foo.Verify(x => x.Bar());   // this does not compile!
Run Code Online (Sandbox Code Playgroud)

反正我是否可以编写上面的代码(不编译的代码?)如果没有,为什么不呢?

c# moq mocking

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

Moq对同一方法的期望使用不同的参数调用

我试图在循环中设置一个模拟对象,它将为具有不同参数的函数调用返回不同的值:

var myMock= new Mock<IInterface>();
for (int i = 0; i < fromKeys.Count; ++i)
{
    var value= new[] {new[] {1.0 + i}};
    _values.Add(value);
    myMock.Setup(x => x.Provide(fromKeys[i])).Returns(new Sth(fromKeys[i], value));
}
_myObject = myMock.Object;
Run Code Online (Sandbox Code Playgroud)

但是当我Provide使用生产代码中的第一个键调用时(而不是在测试设置期间),它会崩溃:

System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
  ----> System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
   at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, ref SignatureStruct sig, MethodAttributes …
Run Code Online (Sandbox Code Playgroud)

.net c# unit-testing moq mocking

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

Moq:使用方法调用序列发送的测试参数

我是C#Moq(过去使用过Rhino Mochs)的新手,需要测试一系列对同一方法的调用.我发现这个很酷的解决方案可以测试一系列返回值:

http://haacked.com/archive/2009/09/29/moq-sequences.aspx/

public static class MoqExtensions
{
  public static void ReturnsInOrder<T, TResult>(this ISetup<T, TResult> setup, 
    params TResult[] results) where T : class  {
    setup.Returns(new Queue<TResult>(results).Dequeue);
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要做的是在对同一方法的一系列调用中测试作为参数发送(而不是它返回的值).

粗略轮廓......

 var expression = new MyExpressionThing();

 processor.Setup(x => x.Execute(expected1)).Verifiable();
 processor.Setup(x => x.Execute(expected2)).Verifiable();
 processor.Setup(x => x.Execute(expected3)).Verifiable();

 expression.ExecuteWith(processor.Object);
 processor.Verify();
Run Code Online (Sandbox Code Playgroud)

这是我尝试过但我得到的例外情况:

"System.ArgumentException:无效的回调.带参数的方法(String,Object [])上的设置无法使用参数(String)调用回调."

 // Arrange
 var processor = new Mock<IMigrationProcessor>();
 IList<string> calls = new List<string>();
 processor.Setup(p => p.Execute(It.IsAny<string>()))
    .Callback<string>(s => calls.Add(s));

// Act
var expr = new ExecuteScriptsInDirectoryExpression { SqlScriptDirectory …
Run Code Online (Sandbox Code Playgroud)

c# moq

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

MOQ单元测试 - 断言Vs验证

我试图了解Exactly Verify或VerifyAll的作用?

我正在搜索,我得到了关于使用MOQ的以下信息

Arrange

Mock
Set up expectations for dependencies
Set up expected results
Create class under test
Act

Invoke method under test
Assert

Assert actual results match expected results
Verify that expectations were met
Run Code Online (Sandbox Code Playgroud)

那么验证究竟做了什么?我可以使用Assert测试所有内容,如果有任何失败,单元测试将失败?

验证还有哪些额外的工作?它是Assert的替代品吗?

更多澄清会让我理解.

谢谢

unit-testing moq

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

使用Moq模拟抽象类

我有以下抽象类和测试方法.使用"Moq"我得到以下错误:

我的Abstact课程:

   public abstract class UserProvider
{ 
    public abstract UserResponseObject CreateUser(UserRequestObject request, string userUrl);

    public abstract bool IsUserExist(UserRequestObject request, string userUrl);
}
Run Code Online (Sandbox Code Playgroud)

测试类:

  [TestMethod()]
    public void CreateUserTest()
    {
        var mockUserProvider = new Mock<UserProvider>(MockBehavior.Loose);

    //GetUserRequestObject is local method to set data

         mockUserProvider.
            Setup(u => u.CreateUser(GetUserRequestObject(), ""))
            .Returns(new UserResponseObject { uid = "123", uri = userUri }).Verifiable();

         var userProvider = mockUserProvider.Object.CreateUser(GetUserRequestObject(), "");

         mockUserProvider.Verify(u => u.CreateUser(GetUserRequestObject(), ""));
    }
Run Code Online (Sandbox Code Playgroud)

错误信息 :

Moq.MockException:模拟上的预期调用至少一次,但从未执行过:u => u.CreateUser(.GetUserRequestObject(),"")

有人请解释一下,为什么我收到这条消息以及如何解决?

c# unit-testing moq

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

如何用Moq制作可验证的所有方法

为了验证该方法是否被调用,我们应该使这个方法可以验证:

// arrange
mock
    .Setup(foo => foo.SomeMethod("param1", "param2", "param3", "param4"))
    .Verifiable();
Run Code Online (Sandbox Code Playgroud)

然后我们可以这样做:

// assert
mock
    .Verify(foo => foo.SomeMethod("param1", "param2", "param3", "param4"));
Run Code Online (Sandbox Code Playgroud)

我想避免这个重复的代码...在复杂测试的情况下,代码变得过载且不可读.

所以我的问题是如何在排列部分中制作可验证的所有方法(带有任何参数)?

注意

我知道VerifyAll():

// assert
mock.VerifyAll();
Run Code Online (Sandbox Code Playgroud)

但它有一个缺点:实际验证的是不明显的.所以我正在寻找一些替代方案.

c# nunit unit-testing moq

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

标签 统计

moq ×10

c# ×8

unit-testing ×6

mocking ×3

.net ×2

entity-framework ×1

linq ×1

nunit ×1