gpt4 book ai didi

c# - Rhinomocks - 模拟代表

转载 作者:行者123 更新时间:2023-11-30 16:30:27 28 4
gpt4 key购买 nike

public interface IServiceInvoker
{
R InvokeService<T, R>(Func<T, R> invokeHandler) where T : class;
}

public class MediaController : Controller
{
private IServiceInvoker _serviceInvoker;
public MediaController(IServiceInvoker serviceInvoker)
{
_serviceInvoker = serviceInvoker;
}

public JsonResult GetAllMedia()
{
var media = _serviceInvoker.InvokeService<IMediaService, List<MediaBase>>(proxy => proxy.GetAllMediaInJson());

JsonResult jsonResult = new JsonResult();
jsonResult.Data = media;
jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return jsonResult;

}


[TestClass]
public class MediaControllerTests
{
[TestMethod]
public void GetAllMedia()
{
JsonResult data;
var serviceInvoker = MockRepository.GenerateStub<IServiceInvoker>();
var media = CreateSeveralMedia();
serviceInvoker.Stub(c => c.InvokeService<IMediaService, List<MediaBase>>(p => p.GetAllMediaInJson())).Return(media);
data = new MediaController(serviceInvoker).GetAllMedia();
serviceInvoker.VerifyAllExpectations();
Assert.IsNotNull(data);
}

我正在对服务进行 stub 并返回一个集合。当我运行此测试时,媒体为空。任何想法,我如何设置这个模拟的期望值?

最佳答案

刚刚找到解决方案。看起来有点丑,不过是第一次迭代,估计以后会出现更优雅的版本。这个想法是创建另一个 stub 并将 Func<> 与之匹配:我将为我的用例提供代码:

[Theory]
[InlineData(342, 31129, 3456)]
public void should_call_service_invoker_and_return_result(int number1, int number2, int expected)
{
var calculator = MockRepository.GenerateStub<ICalculator>();
calculator.Stub(_ => _.Add(number1, number2)).Return(expected);
var serviceInvoker = MockRepository.GenerateStub<ServiceInvoker<ICalculator>>();
serviceInvoker
.Stub(_ => _.Invoke(Arg<Func<ICalculator, int>>.Matches(d => d(calculator) == calculator.Add(number1, number2))))
.Return(expected);
var serviceConsumer = new ServiceConsumer(serviceInvoker);

var actual = serviceConsumer.GetAddResultFor(number1, number2);

Assert.Equal(expected, actual);
}

xUnit + 扩展用作测试框架。请忽略 TheoryInlineData 的东西——它只是另一种摆脱不必要的测试设置的方法。

这是SUT的代码:

public class ServiceConsumer
{
private readonly ServiceInvoker<ICalculator> serviceInvoker;

public ServiceConsumer(ServiceInvoker<ICalculator> serviceInvoker)
{
this.serviceInvoker = serviceInvoker;
}

public int GetAddResultFor(int number1, int number2)
{
return serviceInvoker.Invoke(_ => _.Add(number1, number2));
}
}

public class ServiceInvoker<T>
{
public virtual R Invoke<R>(Func<T, R> func)
{
throw new NotImplementedException();
}
}

public interface ICalculator
{
int Add(int number1, int number2);
}

希望这会有所帮助。欢迎任何关于如何增加更多美感的建议:)

关于c# - Rhinomocks - 模拟代表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650804/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com