上一篇文章,說明了什麼是mock,以及要如何區分stub和mock。這篇將會改寫我們LogAnalyzer
。
我們要測試,是否LogAnalyzer首先我們需要修改我們的程式流程,從取得檔案名稱,衍生至從網站中上傳檔案,然後取得檔名,再檢查檔案名稱,當檔名正確,回傳為true,否則為false。
所以變成:
**網頁上傳 -->...--> 檢查檔名是否為log檔 --> true / false**
然後使用mock後,會變成:
*「製作出網頁上傳的檔案名稱」--> 檢查檔名是否為log檔 --> true / false**
首先我們先製作屬於我們的主要功能與程式(Day13_LogAnalyzer):
class Day13_LogAnalyzer
{
private IWebService service;
//structure: put the interface data to service.
public Day13_LogAnalyzer(IWebService service)
{
this.service = service;
}
public void Analyze(string fileName)
{
if (!fileName.EndsWith(".log", StringComparison.CurrentCultureIgnoreCase))
{
service.LogMessage("false");
}
else
{
service.LogMessage("true");
}
}
}
#region Mock
//interface: Web service's message.
public interface IWebService
{
void LogMessage(string message);
}
//A fake class.
public class FakeWebService : IWebService
{
public string LastMessage;
public void LogMessage(string message)
{
LastMessage = message;
}
}
#endregion
interface
(IWebService
)裡面只有一個function。IWebService
。這個就是我們的mock的皮,這個很像是之前的stub。但是他卻沒有回傳值,多了點額外的功能,所以視為mock。接著是測試的程式(Day13_LogAnalyzer_Test):
class Day13_LogAnalyzer_Test
{
[Test]
public void LogAnalyze_NameSupportedExtension_CallWebservice()
{
FakeWebService mokeSample = new FakeWebService();
Day13_LogAnalyzer log = new Day13_LogAnalyzer(mokeSample);
//log.Analyze("test_false.false"); //it will be error shows false
log.Analyze("test_true.log"); //it will be ture shows true
StringAssert.Contains("true", mokeSample.LastMessage);
}
}
最後結果成功!!(可以是看看錯誤的,會有怎樣的錯誤訊息)
明天製作出Stub和Mock一起使用的案例。