如何使用 NSubstitute 模拟受保护的方法
本文关键字:方法 受保护 模拟 何使用 NSubstitute | 更新日期: 2023-09-27 18:35:03
public static void Mock(out IProgram prog, out IJson json)
{
prog = Substitute.For<IProgram>();
IJson = Substitute.For<IJson>();
prog.SaveProg(1, 1, 1, "Somthing", 1, DateTime.UtcNow,
(DateTime.UtcNow + TimeSpan.FromDays(10)),
10, "someemail@email.com", DateTime.UtcNow, 1)
.Returns(ObjectResult<int?>);
}
我在调用Returns(ObjectResult<int?>)
时收到错误ObjectResult
因为它是受保护的类。我怎样才能解决这个问题,以便能够从实际方法调用我的模拟方法?
NSubstitute 会在您调用替代方法后覆盖该方法的行为,但它实际上并不关心您如何调用该方法。这允许您通过反射调用它。
下面是一个非常详细的示例:
public class SomeRepository
{
public string ReadData() => ActuallyPerformDataReading();
protected virtual string ActuallyPerformDataReading() => "some wrong data";
}
public class SomeClass
{
SomeRepository _someRepository;
public SomeClass(SomeRepository someRepository)
{
_someRepository = someRepository;
}
public string ReadSomething() => _someRepository.ReadData();
}
var repositorySub = Substitute.For<SomeRepository>();
repositorySub.GetType().GetMethod("ActuallyPerformDataReading", BindingFlags.NonPublic | BindingFlags.Instance)
.Invoke(repositorySub, new object[] {}).Returns("some test data");
var sut = new SomeClass(repositorySub);
var result = sut.ReadSomething(); //"some test data"
你不应该能够模拟受保护的类/方法。它受到显式保护,因此您无法这样做。如果您需要模拟它,请将其公开。如果这是别人的方法,而你认为你需要模拟它,那么你的测试可能是错误的。
编辑:受保护方法中的任何功能只能由同一类中的公共方法使用。 模拟该公共方法以根据需要执行操作,给定受保护方法的一些所需结果。