我想嘲笑System.IO.FileInfo.Extension方法,让它返回是“.xls”,但我不能得到任何工作模拟混凝土FileInfo对象
This Example的伟大工程删除,但不是扩展(代码将无法编译)
我一直在使用这个example也试过,但代码是错误的。
- 我JustMock 完全许可副本
- 我使用VS 2010的.NET 4.0
编辑: 我知道我可以设置一个界面和测试方式,但付费版JustMock应该模拟具体的课程。既然我付了钱,我想知道怎么做。
我想嘲笑System.IO.FileInfo.Extension方法,让它返回是“.xls”,但我不能得到任何工作模拟混凝土FileInfo对象
This Example的伟大工程删除,但不是扩展(代码将无法编译)
我一直在使用这个example也试过,但代码是错误的。
编辑: 我知道我可以设置一个界面和测试方式,但付费版JustMock应该模拟具体的课程。既然我付了钱,我想知道怎么做。
随着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);
}
}
这听起来像你只是需要将该依赖关系抽象为另一个包装类,然后它会很容易嘲笑。
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);
由于延长现在被标记为虚,最嘲讽的框架就能够对其进行修改。
想我是缺少一个属性
[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);
}
}
很好,谢谢你与我们分享答案! – 2012-04-18 13:06:46
是的,我想和你@Tejs同意和我已经做了,在过去,但我被告知,JustMock会嘲笑具体类和想要使用具体类 – 2012-04-16 15:59:11
也许,但我发现无论如何将这些硬依赖关系提取到自己的类中会更好。此外,您可能需要使用工厂模式来移除代码中的'new'调用,以使其更易于进行单元测试。 – Tejs 2012-04-16 16:02:25