模拟具体FileInfo对象

时间:2012-04-16 15:47:07

标签: c# mocking justmock

我想模拟System.IO.FileInfo.Extension方法并让它返回“.xls”,但我无法正常工作

This Example适用于删除但不适用于扩展(代码无法编译)

  [ClassInitialize]
      public static void Initialize(TestContext context)
      {
         Mock.Partial<FileInfo>().For((x) => x.Extension);
      }

我也尝试使用此example,但代码错误。

  • 我有JustMock的完全许可副本
  • 我正在使用VS 2010 .net 4.0

编辑: 我知道我可以设置一个接口并以这种方式进行测试,但付费版JustMock应该模拟具体的类。由于我付了钱,我想知道如何这样做。

3 个答案:

答案 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);

因为扩展现在被标记为虚拟,所以大多数模拟框架都能够修改它。