我必須使用一些我無法更改的遺留代碼。我必須編寫實現了一個名爲「ITask」的接口的類,該接口具有一個名爲「RunTask」的方法,該方法接受稱爲Schedule的具體類型例如;我可以模擬SqlConnection.BeginTransaction c#?
public void RunTask(Schedule thisSchedule)
{
//I have to do stuff with thisSchedule, no I can't fix that name...
}
雖然舊的代碼不使用單元測試我倒是十分喜歡用它爲我的工作,但問題是「thisSchedule」。我製作了一個僞造的Schedule版本,它試圖控制它內部的所有方法的功能(這可能是一個傻瓜的差事)。到目前爲止,我已經成功地通過利用虛驚的數量虛擬方法或通過使用反射,但我已經打到我的第一個顯示停止
我無法連接到真正的數據庫,我有一個經常調用的方法;
public void BeginTransaction()
{
MyTransaction = MyConnection.BeginTransaction(IsolationLevel.RepeatableRead);
}
internal SqlConnection MyConnection = new System.Data.SqlClient.SqlConnection();
這將引發異常,因爲連接被關閉,我非常希望能夠設置一個標誌,說明該方法被調用,然後就吞下例外,但我會很樂意簡單地忽略異常。
任何事情,無論多麼令人討厭,這將讓我通過這種方法調用將是一個可以接受的答案。這是或失敗。
我不允許在Visual Studio企業中使用typeMock或Shim等付費服務。
編輯
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Data;
using System.Data.SqlClient;
namespace PredictionServicesTests
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void BeginTransaction_WhenCalled_SetsTransactionStartedToTrue()
{
Schedule schedule = new FakeSchedule();
schedule.BeginTransaction(); //It would be enough to simply get past this line to the Assert
Assert.IsTrue(((FakeSchedule)schedule).TransactionStarted); //This would be nice, but isn't vital
}
class Schedule
{
private SqlTransaction MyTransaction;
internal SqlConnection MyConnection = new System.Data.SqlClient.SqlConnection();
public void BeginTransaction()
{
MyTransaction = MyConnection.BeginTransaction(IsolationLevel.RepeatableRead);
}
}
class FakeSchedule : Schedule
{
public bool TransactionStarted { get; set; }
}
}
}
請記住,我不能改變的時間表類,只要事情能這麼簡單!
ITask接口;
interface ITask
{
void RunTask(Schedule thisSchedule);
}
您可以勻/僞造它與微軟的正版正貨取決於您的Visual Studio版本。在2015/2017年,它包含在企業版中。在2013年,它包含在Premium和Ultimate版本中。 – Igor
你可以使用免費的Moq。也看看使用接口。將使單元測試這種類型的東西更容易。在交易的情況下,也許你可以通過IDbTransaction。 –
「不允許使用typeMock或Shims之類的付費服務」這是一個技術限制嗎? – mxmissile