[英]Autofac mock - How do I setup/fake data from specific methods in dependencies?
我不熟悉单元测试,Autofac和模拟很可能,这相对容易,但我很难搞清楚。
我有这个类SystemUnderTest
有一个依赖,有两个方法GetValueOne
和GetValueTwo
。
public class SystemUnderTest : ISystemUnderTest
{
private readonly IDependency _dependency;
public SystemUnderTest(IDependency dependency)
{
_dependency = dependency;
}
public string GetValueOne()
{
return _dependency.GetValueOne();
}
public string GetValueTwo()
{
return _dependency.GetValueTwo();
}
}
public interface ISystemUnderTest
{
string GetValueOne();
string GetValueTwo();
}
这些方法从依赖项中获取数据。
public class Dependency : IDependency
{
public string GetValueOne()
{
return "get-value-one";
}
public string GetValueTwo()
{
return "get-value-two";
}
}
public interface IDependency
{
string GetValueOne();
string GetValueTwo();
}
我试图伪造其中一个方法(“ GetValueTwo
”)的数据,因此它返回"expected value"
而不是"get-value-two"
,这是依赖性通常返回的。
[Fact]
public async Task Test_SystemUnderTest()
{
using (var mock = AutoMock.GetLoose())
{
// Setup
mock.Mock<IDependency>().Setup(x => x.GetValueTwo()).Returns("expected value");
// Configure
mock.Provide<IDependency, Dependency>();
// Arrange - configure the mock
var sut = mock.Create<SystemUnderTest>();
// Act
var actual_GetValueOne = sut.GetValueOne();
var actual_GetValueTwo = sut.GetValueTwo();
// Assert - assert on the mock
Assert.Equal("get-value-one", actual_GetValueOne);
Assert.Equal("expected value", actual_GetValueTwo);
}
}
在我的测试的第一部分, Setup
件,似乎没有任何影响,它可能是因为我做了一些基本的错误。
任何有关如何挽救我一天的见解的人?
在进行部分模拟时, Dependency
实现的成员需要具有虚拟成员才能覆盖它们。
public class Dependency : IDependency {
public virtual string GetValueOne() {
return "get-value-one";
}
public virtual string GetValueTwo() {
return "get-value-two";
}
}
然后类似于另一个答案中的建议,您将改为模拟实现,确保启用它来调用基本成员并仅设置您需要覆盖的成员。
public void Test_SystemUnderTest() {
using (var mock = AutoMock.GetLoose()) {
// Setup
var dependency = mock.Mock<Dependency>();
dependency.CallBase = true;
dependency.Setup(x => x.GetValueTwo()).Returns("expected value");
// Configure
mock.Provide<IDependency>(dependency.Object);
// Arrange - configure the mock
var sut = mock.Create<SystemUnderTest>();
// Act
var actual_GetValueOne = sut.GetValueOne();
var actual_GetValueTwo = sut.GetValueTwo();
// Assert - assert on the mock
Assert.AreEqual("get-value-one", actual_GetValueOne);
Assert.AreEqual("expected value", actual_GetValueTwo);
}
}
执行上述过程,前提是需要virtual
的实现成员可以被覆盖(即virtual
)。
不是编写单元测试的专家,但我很确定通过使用Provide
和两个类型参数,您可以覆盖之前执行的Setup
部分。 根据我的理解, Provide
方法应该用于提供你自己的目标接口的模拟实现,因此同时使用Provide
和两个类型参数以及相同依赖项的Setup
是没有意义的。
因此,您可以修改Dependency
实现的GetValueTwo
以返回"expected value"
并使用未经修改的其余代码,或者您可以使用一个类型参数Provide
方法Provide
模拟实例,并使用以前设置的两种方法,如下所示:
[Fact]
public async Task Test_SystemUnderTest()
{
using (var mock = AutoMock.GetLoose())
{
var mockedDependency = mock.Mock<IDependency>();
// Setup
mockedDependency.Setup(x => x.GetValueOne()).Returns("get-value-one");
mockedDependency.Setup(x => x.GetValueTwo()).Returns("expected value");
// The following line is not even necessary
mock.Provide<IDependency>(mockedDependency.Object);
// Arrange - configure the mock
var sut = mock.Create<SystemUnderTest>();
// Act
var actual_GetValueOne = sut.GetValueOne();
var actual_GetValueTwo = sut.GetValueTwo();
// Assert - assert on the mock
Assert.Equal("get-value-one", actual_GetValueOne);
Assert.Equal("expected value", actual_GetValueTwo);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.