如何解决如何验证返回模拟的函数工厂的调用?
被测系统 (Sut) 采用两个参数 Func<IFoo>
和 IBar
。在 Sut
内部实例化 IFoo
的对象,然后调用 foo
和 _bar
。
public class Sut : ISut
{
readonly Func<IFoo> _fooFactory;
IBar _bar;
public Sut(Func<IFoo> fooFactory,IBar bar)
{
_fooFactory = fooFactory;
_bar = bar;
}
public SutMethod()
{
foo = _fooFactory();
foo.fooMethod();
_bar.barMethod();
}
}
然后使用其模拟 _bar
来测试 barMock
的调用。但是我如何测试 foo
?我怎么能说 foo
是
- 实例化和
- 叫
?
public class Test
{
Func<Func<IFoo>,IBar,ISut> _sutFactory;
public Test(Func<Func<IFoo>,ISut> sutFactory)
{
_sutFactory = sutFactory;
}
[Fact]
public void TestCase()
{
Func<IFoo> fooFactory = () =>
{
var mock => new Mock<IFoo>();
mock.Setup(x => x.fooMethod();
return mock.Object;
}
Mock<IBar> barMock = new Mock<IBar>();
sut = _sutFactory(fooFactory,barMock);
sut.SutMethod();
barMock.Verify(mock => mock.barMethod(),Times.Once());
}
}
解决方法
在工厂委托之外创建模拟,以便您可以访问它进行验证
public class Test {
Func<Func<IFoo>,IBar,ISut> _sutFactory;
public Test(Func<Func<IFoo>,ISut> sutFactory) {
_sutFactory = sutFactory;
}
[Fact]
public void TestCase() {
//Arrange
Mock<IFoo> fooMock = null;
Func<IFoo> fooFactory = () => {
fooMock = new Mock<IFoo>();
return fooMock.Object;
}
Mock<IBar> barMock = new Mock<IBar>();
ISut sut = _sutFactory(fooFactory,barMock);
//Act
sut.SutMethod();
//Assert
barMock.Verify(mock => mock.barMethod(),Times.Once());
// 1. instantiated
Assert.IsNotNull(fooMock);
// 2. called
fooMock.Verify(mock => mock.fooMethod(),Times.Once());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。