Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟服务频道_C#_Asp.net Mvc_Unit Testing_Nunit_Moq - Fatal编程技术网

C# 模拟服务频道

C# 模拟服务频道,c#,asp.net-mvc,unit-testing,nunit,moq,C#,Asp.net Mvc,Unit Testing,Nunit,Moq,我正在为已经编写的代码编写一些单元测试。令人惊讶的是,我遇到了以前从未遇到过的情况 简而言之,我需要测试一个控制器,该控制器通过DI接收服务依赖项,并且在索引操作中,对该服务调用一个方法以返回视图的数据 我的问题是,我似乎无法模拟服务依赖性。我试着搜索了一下,但找不到任何与我的问题(或我缺乏理解)直接相关的东西 以下是控制器的示例: public partial class SomeController : Controller { private readonly IServiceCh

我正在为已经编写的代码编写一些单元测试。令人惊讶的是,我遇到了以前从未遇到过的情况

简而言之,我需要测试一个控制器,该控制器通过DI接收服务依赖项,并且在索引操作中,对该服务调用一个方法以返回视图的数据

我的问题是,我似乎无法模拟服务依赖性。我试着搜索了一下,但找不到任何与我的问题(或我缺乏理解)直接相关的东西

以下是控制器的示例:

public partial class SomeController : Controller
{
    private readonly IServiceChannel<ISomeService> _someChannel;

    public SomeController(IServiceChannel<ISomeService> someChannel)
    {
        _someChannel= someChannel;
    }

    public virtual ActionResult Index()
    {
        var response = _someChannel.Fetch(someService => someService .GetSomeData(
            new GetSomeDataRequest
            {
                Id= StaticData.Id,
                All = true
            }
        ));

        var model = new IndexViewModel
        {
            AllData= response.AllData
        };

        return View(model);
    }
}
公共部分类SomeController:Controller
{
专用只读阅读器Vicechannel(someChannel);
公共SomeController(IServiceChannel someChannel)
{
_someChannel=someChannel;
}
公共虚拟操作结果索引()
{
var response=\u someChannel.Fetch(someService=>someService.GetSomeData(
新GetSomeDataRequest
{
Id=StaticData.Id,
全部=正确
}
));
var模型=新的IndexViewModel
{
AllData=response.AllData
};
返回视图(模型);
}
}
如您所见,DI注入了一个IServiceChannel实例,该实例具有一个“Fetch”方法。然后,该方法允许您访问ISomeService,从那里您可以使用必要的参数调用接口上的任何方法

我尝试使用以下逻辑编写一个测试:

[TestFixture]
public class SomeControllerTests
{
    private IServiceChannel<ISomeService> _someChannel;
    [SetUp]
    public void Setup()
    {
        var someChannelMoc = new Mock<IServiceChannel<ISomeService>>();
        someChannelMoc.Setup(
            i => i.Fetch(service => service.GetSomeData(It.IsAny<GetSomeDataRequest>())))
            .Returns(new GetSomeDataResponse());

        _someChannel= someChannelMoc.Object;
    }

    [Test]
    public void IndexTest()
    {
        var controller = new SomeController(_someChannel);
        var result = controller.Index();
        Assert.IsNotNull(result);
    }
}
[TestFixture]
公共类SomeControllerTests
{
私人电视频道;
[设置]
公共作废设置()
{
var someChannelMoc=new Mock();
安装程序(
i=>i.Fetch(service=>service.GetSomeData(It.IsAny()))
.Returns(new GetSomeDataResponse());
_someChannel=someChannelMoc.Object;
}
[测试]
公共无效索引()
{
var控制器=新的SomeController(_someChannel);
var result=controller.Index();
Assert.IsNotNull(结果);
}
}
这一切都构建得很好,但当测试运行时,我看到以下错误:

安装程序:System.NotSupportedException:不支持的表达式:服务 =>Moq.MatcherFactory.CreateMatcher(表达式,布尔值)处的service.GetSomeData(IsAny()) iParams)在Moq.MethodCall..ctor(模拟、模拟、条件、, 表达式原始表达式,MethodInfo方法,表达式[] 参数)在Moq.MethodCallReturn..ctor(模拟模拟,条件 条件,表达式原始表达式,MethodInfo方法, Moq.MethodCallReturn
2..ctor(Mock-Mock,
条件条件,表达式原始表达式,MethodInfo方法,
表达式[]参数)位于
Moq.Mock.c_uudisplayClass1c
2.b_uu1b()位于 Moq.PexProtector.Invoke[T](函数
1函数)位于
Moq.Mock.Setup[T,TResult](Mock
1 Mock,Expression
1 Expression,
最小起订量时的条件模拟
1.设置[TResult](表达式'1 表达式)在MyProj.Tests.Controllers.SomeControllerTests.Setup()中 路径内定位

任何帮助都将不胜感激

嗯,经过一番努力,我想我找到了答案。我需要匹配IServiceChannel实现中的函数参数:

public TResult Fetch<TResult>(Func<T, TResult> block)
{ ... }
公共TResult获取(Func块)
{ ... }
因此,现在我的测试设置更改为如下所示:

 var someChannelMoc = new Mock<IServiceChannel<ISomeService>>();
            someChannelMoc.Setup(i => i.Fetch(It.IsAny<Func<ISomeService,GetSomeDataResponse>>()))
                .Returns(()=>new GetSomeDataResponse{AllData= new List<Data>()});

            _someChannel = someChannelMoc.Object;
var someChannelMoc=new Mock();
someChannelMoc.Setup(i=>i.Fetch(It.IsAny()))
.Returns(()=>newgetsomedataresponse{AllData=newlist()});
_someChannel=someChannelMoc.Object;
为了更好的东西,我将暂缓将此标记为已回答,以查看是否有更好的东西出现,因为我无法为函数指定输入参数。这对我来说不是问题,但对将来的某个人来说可能是问题