如何解决N代替在模拟接口上将Action作为参数执行
反正我可以在模拟服务中执行操作作为参数吗?
我在单元测试方法中使用了一个接口:
interface IMyTracker
{
void TrackerMethod(string name,Action action);
}
这是我要进行单元测试的方法:
private void Method1(IMyTracker myTracker)
{
myTracker.TrackerMethod("Method1",() =>
{
// This is stuff I want to execute!
}
}
这是我的单元测试
[Test]
public void TestMethod1()
{
var trackerSub = Substitute.For<IMyTracker>();
trackerSub.TrackerMethod(Arg.Any<string>(),Arg.Invoke<Action>()); //How do I execute the logic inside the lambda expression action? Is it at all possible? Or once it's mocked,is that logic lost?
GetClassInstance().Method1(trackerSub);
}
这里的任何帮助都会很棒。
解决方法
我创建了示例代码,向您展示其工作方式。 因此,一开始我们会为您提供界面:
public interface ITracker
{
void TrackerMethod(string name,Action action);
}
接下来,我们获得了使用该接口并在跟踪器中执行任何操作的示例类,请看这里:
public class AnyClass
{
private readonly ILogger _anyLogger;
public AnyClass(ILogger anyLogger)
{
this._anyLogger = anyLogger;
}
public void AnyMethod(ITracker tracker)
{
tracker.TrackerMethod("mymethod",() =>
{
_anyLogger.LogError("i was here");
});
}
}
,此情况下的单元测试如下:
[Fact]
public void TestMethod1()
{
var logger = Substitute.For<ILogger>();
var tracker = Substitute.For<ITracker>();
tracker.TrackerMethod(Arg.Any<string>(),Arg.Invoke());
AnyClass anyClass = new AnyClass(logger);
anyClass.AnyMethod(tracker);
logger.Received().LogError("i was here");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。