C# 模拟具体FileInfo对象

C# 模拟具体FileInfo对象,c#,mocking,justmock,C#,Mocking,Justmock,我想模拟System.IO.FileInfo.Extension方法并让它返回“.xls”,但我无法让任何东西正常工作 非常适合删除,但不适合扩展(代码不会编译) [分类初始化] 公共静态void初始化(TestContext上下文) { Mock.Partial(),用于((x)=>x.Extension); } 我也尝试过使用这个,但代码是错误的 我有一份完全授权的JustMock副本 我正在使用VS2010.NET4.0 编辑: 我知道我可以通过这种方式设置接口和测试,但是付费版本J

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

非常适合删除,但不适合扩展(代码不会编译)

[分类初始化]
公共静态void初始化(TestContext上下文)
{
Mock.Partial(),用于((x)=>x.Extension);
}
我也尝试过使用这个,但代码是错误的

  • 我有一份完全授权的JustMock副本
  • 我正在使用VS2010.NET4.0
编辑:
我知道我可以通过这种方式设置接口和测试,但是付费版本JustMock应该模拟具体的类。因为我付了钱,所以我想知道如何这样做。

我觉得您只需要将依赖项抽象到另一个包装器类中,然后就可以很容易地模仿它了

 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);
       }

}
[TestClass,MockClass]//**添加了MockClass**
公共类UnitTest1
{
[分类初始化]
公共静态void Init(TestContext上下文)
{
Mock.Partial()For(x=>x.Extension);
}
[测试方法]
public void ShouldAssertFileInfoExtension()
{
var fileInfo=Mock.Create(Constructor.Mocked);
字符串应为=“测试”;
Mock.Arrange(()=>fileInfo.Extension).返回(预期);
Assert.AreEqual(预期为fileInfo.Extension);
}
}

最新版本的JustMock(2012年第2季度)。模拟MsCrolib成员不再需要MockClassAtribute

您可以通过以下方式编写上述测试:

[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);
       }
}
[TestClass]
公共类UnitTest1
{
[分类初始化]
公共静态void Init(TestContext上下文)
{
Replace(x=>x.Extension).In();
}
[测试方法]
public void ShouldAssertFileInfoExtension()
{
var fileInfo=Mock.Create(Constructor.Mocked);
字符串应为=“测试”;
Mock.Arrange(()=>fileInfo.Extension).返回(预期);
Assert.AreEqual(预期为fileInfo.Extension);
}
}

是的,我同意你的观点@Tejs,我过去也这么做过,但我被告知JustMock将模拟具体的类,并希望使用具体的classesPerhaps,但我发现无论如何将这些硬依赖项提取到它们自己的类中会更好。另外,您可能需要使用工厂模式从代码中删除
new
调用,以使其更易于单元测试。
[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);
       }
}