我想模拟System.IO.FileInfo.Extension方法并让它返回“.xls”,但我无法正常工作
This Example适用于删除但不适用于扩展(代码无法编译)
[ClassInitialize]
public static void Initialize(TestContext context)
{
Mock.Partial<FileInfo>().For((x) => x.Extension);
}
我也尝试使用此example,但代码错误。
编辑: 我知道我可以设置一个接口并以这种方式进行测试,但付费版JustMock应该模拟具体的类。由于我付了钱,我想知道如何这样做。
答案 0 :(得分:1)
猜猜我错过了一个属性
[TestClass, MockClass] // **MockClass Added**
public class UnitTest1
{
[ClassInitialize]
public static void Init(TestContext context)
{
Mock.Partial<FileInfo>().For<FileInfo, string>(x => x.Extension);
}
[TestMethod]
public void ShouldAssertFileInfoExtension()
{
var fileInfo = Mock.Create<FileInfo>(Constructor.Mocked);
string expected = "test";
Mock.Arrange(() => fileInfo.Extension).Returns(expected);
Assert.AreEqual(fileInfo.Extension, expected);
}
}
答案 1 :(得分:1)
JustMock的最新版本(2012年第二季度)。您不再需要MockClassAtriibute来模拟MsCrolib成员。
您可以通过以下方式非常详细地编写上述测试:
[TestClass]
public class UnitTest1
{
[ClassInitialize]
public static void Init(TestContext context)
{
Mock.Replace<FileInfo, string>(x=> x.Extension).In<UnitTest1>();
}
[TestMethod]
public void ShouldAssertFileInfoExtension()
{
var fileInfo = Mock.Create<FileInfo>(Constructor.Mocked);
string expected = "test";
Mock.Arrange(() => fileInfo.Extension).Returns(expected);
Assert.AreEqual(fileInfo.Extension, expected);
}
}
答案 2 :(得分:0)
听起来我只需要将该依赖项抽象到另一个包装类中,然后就可以很容易地进行模拟了。
public class FileInfoAbstraction
{
protected FileInfo _fileInfo = null;
public virtual string Extension
{
get { return _fileInfo.Extension; }
}
public FileInfoAbstraction(string path)
{
_fileInfo = new FileInfo(path);
}
}
然后,无论您在何处使用FileInfo类,请插入您的抽象:
var myFileInfo = new FileInfoAbstraction(somePath);
因为扩展现在被标记为虚拟,所以大多数模拟框架都能够修改它。