Moq使用ReturnsAsync并修改It.IsAny输入参数

时间:2014-09-23 14:07:11

标签: c# moq

使用ReturnsAsync时,我们只能让它返回一个新对象。是否有更好/更正确的方法来编写下面的代码?

在这个例子中,我们有一些存储库,我们的实现接受一个Thing类型的对象,它有一个Id(我们想假装我们的数据库设置了Id)属性:

var repo = new Mock<IRepositoryOfThings>();

//Is there a better way to do this perhaps using ReturnsAsync??
repo.Setup(r => r.Add(It.IsAny<Thing>())).Returns(
    (Thing x) =>
    {
        var tcs = new TaskCompletionSource<Thing>();
        x.Id = Guid.NewGuid().ToString();
        tcs.SetResult(x);
        return tcs.Task;
    });

谢谢!

2 个答案:

答案 0 :(得分:2)

这是我能找到的最好的:

var repo = new Mock<IRepositoryOfThings>();

repo.Setup(r => r.Add(It.IsAny<Thing>())).Returns(
    (Thing x) =>
    {
        x.Id = Guid.NewGuid().ToString();
        return Task.FromResult(x);
    });

不幸的是,这与你的答案实际上是一样的。

答案 1 :(得分:0)

您可以仅初始化Thing的实例并在设置中返回该实例。

ChildForm = new ChildForm();
ChildForm.Show(this);