Tru*_*ill 7 moq xunit.net autofixture automocking
鉴于此系统要测试:
public class MySut
{
private readonly IHardToMockDependency _hardToMockDependency;
public MySut(IHardToMockDependency hardToMockDependency,
IOtherDependency otherDependency)
{
_hardToMockDependency = hardToMockDependency;
}
public string GetResult()
{
return _hardToMockDependency.GetResult();
}
}
public interface IOtherDependency { }
public interface IHardToMockDependency
{
string GetResult();
}
Run Code Online (Sandbox Code Playgroud)
而这个单元测试:
internal class FakeHardToMockDependency : IHardToMockDependency
{
private readonly string _result;
public FakeHardToMockDependency(string result)
{
_result = result;
}
public string GetResult()
{
return _result;
}
}
public class MyTests
{
[Fact]
public void GetResultReturnsExpected()
{
string expectedResult = "what I want";
var otherDependencyDummy = new Mock<IOtherDependency>();
var sut = new MySut(new FakeHardToMockDependency(expectedResult),
otherDependencyDummy.Object);
var actualResult = sut.GetResult();
Assert.Equal(expectedResult, actualResult);
}
}
Run Code Online (Sandbox Code Playgroud)
我应该如何将其转换为使用AutoFixture.Xunit和AutoFixture.AutoMoq(同时仍然使用手动假)?
在实际测试中,手动假冒将具有更复杂的界面和行为.请注意,我想将匿名变量(expectedResult字符串)传递给手动伪造的构造函数.
这里已经有了一些很好的答案,但是我想建议一个更简单的替代方法,它会略微放松FakeHardToMockDependency类的不变量.将其公开,并提供一种方法来分配与构造函数分离的结果:
public class FakeHardToMockDependency : IHardToMockDependency
{
private string _result;
public FakeHardToMockDependency(string result)
{
_result = result;
}
internal string Result
{
get { return _result; }
set { _result = value; }
}
public string GetResult()
{
return _result;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已添加内部属性并readonly从字段中删除了关键字.
这使您可以将原始测试重构为:
[Theory, AutoMoqData]
public void GetResultReturnsExpected_AutoDataVersion(
[Frozen(As = typeof(IHardToMockDependency))]FakeHardToMockDependency fake,
MySut sut)
{
var expected = "what I want";
fake.Result = expected;
var actual = sut.GetResult();
Assert.Equal(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)
为完整起见,这是AutoMoqDataAttribute代码:
public class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute()
: base(new Fixture().Customize(new AutoMoqCustomization()))
{
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2624 次 |
| 最近记录: |