我想嘲笑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