C# 模拟具体FileInfo对象
我想模拟System.IO.FileInfo.Extension方法并让它返回“.xls”,但我无法让任何东西正常工作 非常适合删除,但不适合扩展(代码不会编译)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
[分类初始化]
公共静态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);
}
}