我嘗試對 Windows 表單進行單元測驗。某些表單具有顯示訊息框的代碼。我想測驗訊息框文本并從單元測驗中關閉訊息框表單。我該如何制作它們?
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
MessageBox.Show("Form opened");
}
}
[TestMethod]
public void Form1_Load()
{
Form1 form = new Form1();
//How to find messagebox to test TEXT and close the MESSAGEBOX form?
}
uj5u.com熱心網友回復:
我認為您不想測驗 MessageBox 的功能,畢竟這是一個 windows 方法。你必須相信微軟他們已經測驗過這個課程。
您想要測驗的是,當您的表單加載時,它會向操作員顯示一些資訊。您想隱藏這是使用 MessageBox 完成的。這樣做的好處是,如果您希望其他方法向操作員顯示某些內容,則可以重用此方法。
另一個優點:您還可以更改向操作員顯示內容的方式,而無需更改該方法的所有用戶。例如,如果您想在警告操作員時發出嗶聲,或者您想記錄操作員已確認閱讀警告。如果在單獨的方法中執行此操作,則不必更改此方法的所有用戶。
換句話說:您的表單有一個 OperatorInformer 物件(TODO:發明一個專有名稱)。這個物件實作了一個介面:
interface IOperatorInformer
{
void ShowMessage(string text, ...);
void ShowWarning(string text, ...);
void ShowError(string text, ...);
...
}
如果您需要了解語言,請考慮創建一個包含所有警告和錯誤的列舉。界面將是:
enum OperatoInformationId {...}
interface IOperatorInformer
{
void InformOperator(OperatorInformationId id, ...);
...
}
OperatorInformer 的任務是將 OperationInformationId 轉換為正確的文本,
class OperatorInformer : IOperatorInformer
{
...
public static IOperatorInformer Default {get;} = new OperatorInformer;
}
這個 OperatorInformer 可以使用MessageBox.Show來顯示所需的文本,以及所需的圖示、聲音、標題等。
這不會解決測驗顯示 MessageBox 的問題,但由于這是一個小類,出錯的機會很小。如果你真的需要測驗OperatorInformer,考慮到做同樣的介面IMessageBox,這將定義MessageBox的方法,以及一類MessageBox,將使用System.Windows.Forms.MessageBox以顯示資訊。
class Form1 : Form
{
// make sure there is always at least the default operator informer:
public IOperatorInformer OperatorInformer {get; set;} = OperatorInformer.Default();
...
}
單元測驗方法 Form1_Load
定義介面 IOperatorInformer 后,您可以更改您的要求:
要求:當 Form1 加載時,方法只
IOperatorInformer.ShowMessage被呼叫一次,帶有文本“表單已打開”、一個圖示......和一個標題欄......
這是更容易進行單元測驗的方式:
class UnitTestInformer : IOperatorInformer
{
public int CallCount {get; private set;} = 0;
public string Text {get; private set;}
public MessageBoxIcon Icon {get; private set;} = MessageBoxIcon.None;
...
public void ShowMessage(string text, MessageBoxIcon icon, ...)
{
this.CallCount;
this.Text = text,
this.Icon = icon,
...
}
}
你的單元測驗(每個測驗都從需求中測驗一件事)
[TestMethod]
public void Form1_Load_ShowsOperatorInputExactlyOnce()
{
// Create a unitTestInformer and a Form1 that uses this UnitTestInformer
UnitTestInformer unitTestInfomer = new UnitTestInformer();
Form1 form = new Form1()
{
OperatorInformer = unitTestInformer;
};
form.Show(); // this should Load the form
Assert.AreEqual(1, unitTestInformer.CallCount);
}
[測驗方法] public void Form1_Load_OperatorInputText() {
UnitTestInformer unitTestInfomer = new UnitTestInformer();
Form1 form = new Form1()
{
OperatorInformer = unitTestInformer;
};
form.Show();
Assert.AreEqual("Form opened", unitTestInformer.Text);
}
等等。還有圖示和標題欄的單元測驗
uj5u.com熱心網友回復:
我的解決方案如下所示。感謝您的建議
public partial class Form1 : Form
{
public Form1(){InitializeComponent();}
internal bool is_Message_Show = true;
internal string message_For_Test ;
internal DialogResult dialogResult_From_Test;
internal void btnAdd_Click(object sender, EventArgs e)
{
DialogResult result = DialogResult.No;
if (is_Message_Show)
{
result = MessageBox.Show("Do you want to add", "WARNING", MessageBoxButtons.YesNo);
}
else
{
result = dialogResult_From_Test;
}
if (result == DialogResult.Yes)
{
}
}
internal void btnDelete_Click(object sender, EventArgs e)
{
string message = "Deleted";
if (is_Message_Show)
{
MessageBox.Show(message);
}
else
{
message_For_Test = message;
}
}
}
[TestMethod]
public void btnAdd_Click_Yes()
{
Form1 form = new Form1();
form.is_Message_Show = false;
form.dialogResult_From_Test = System.Windows.Forms.DialogResult.Yes;
form.btnAdd_Click(null, null);
}
[TestMethod]
public void btnDelete_Click()
{
Form1 form = new Form1();
form.is_Message_Show = false;
form.btnDelete_Click(null, null);
Assert.AreEqual("Deleted", form.message_For_Test);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362641.html
上一篇:創建由多對多欄位組成的模型實體
下一篇:如何處理C 中的運行時錯誤?
