2011-11-10 19 views
8

Tôi biết tôi có thể sử dụng dữ liệu trong các tệp để kiểm tra đơn vị, ví dụ: dữ liệu bên trong tệp csv hoặc xml.Có cách nào để sử dụng dữ liệu đã có trong bộ nhớ để kiểm tra đơn vị không?

Ví dụ:

[TestMethod] 
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)] 
public void TestData() {} 

Tôi muốn biết nếu có một cách đó, thay vì sử dụng một tập tin, tôi có thể sử dụng một cấu trúc dữ liệu đó là đã có trong bộ nhớ để lái các bài kiểm tra.

Cái gì như:

// this structure has the data to use in the unit test 
var DataList = new List<string>(); 

[TestMethod] 
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.IEnumerable", 
    "DataList", 
    "DataList", 
    DataAccessMethod.Sequential)] 
public void TestData() {} 
+0

câu hỏi tương tự [Cách RowTest với MSTest?] (Http://stackoverflow.com/q/347535) –

Trả lời

1

Một giải pháp đơn giản có thể được này ...

private void TestData(IEnumerable what) { ... your test method ... } 

[TestMethod] 
public void TestDataInMemory() { List<T> mylist = ...; this.TestData(mylist); } 

[TestMethod] 
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)] 
public void TestData() { this.TestData(testContextInstance ...) } 

Bằng cách này bạn có thể sử dụng phương pháp thử nghiệm của bạn cả với các dữ liệu được nạp từ tập tin và dữ liệu được nạp từ ký ức.

+0

Cảm ơn đề xuất của bạn. Thật không may, có vẻ như với tôi rằng TestDataInMemory() test sẽ được chạy một lần duy nhất cho bất kỳ số lượng các mục dữ liệu nào, trong khi TestData() test sẽ được chạy một lần cho mỗi mục nhập. Đối với mục đích của tôi, tôi thà chạy một bài kiểm tra cho mỗi mục. –

1

Tôi không nghĩ rằng bạn có thể làm điều đó với thuộc tính [DataSource], nhưng bạn có thể thực hiện nhiều việc tương tự theo cách thủ công.

Tải dữ liệu của bạn theo phương pháp được trang trí với [AssemblyInitialize] hoặc [ClassInitialize]. Sau đó viết lại các bài kiểm tra của bạn để lặp qua dữ liệu. Thật không may theo cách này bạn sẽ kết thúc với một bài kiểm tra duy nhất thay vì kết quả riêng biệt cho mỗi chạy thử nghiệm.

+0

Có, dữ liệu đã được thiết lập trong chức năng [ClassInitialize] và tôi đã thử những gì bạn đề xuất. Nó hoạt động, nhưng một thử nghiệm duy nhất cho tất cả dữ liệu có nghĩa là Asserts sẽ dừng chức năng trong lần kiểm tra đầu tiên bị lỗi. Không thực sự những gì tôi đang tìm kiếm. Cám ơn vì sự gợi ý. –

3

Nếu nó ở trong bộ nhớ, sở thích của tôi sẽ không sử dụng DataSource, nhưng sử dụng mẫu T4 để tự động tạo các bài kiểm tra đơn vị của bạn thay thế. Bằng cách này, bạn sẽ chỉ viết bài kiểm tra một lần, nhưng trong kết quả cho chạy thử nghiệm, bạn sẽ thấy một mục nhập cho mỗi đầu vào mà bạn đã kiểm tra. Thêm tệp .tt này vào dự án thử nghiệm của bạn.

<#@ template debug="false" hostspecific="true" language="C#v3.5" #> 
<#@ assembly name="System.Core.dll" #> 
<#@ assembly name="System.Data.dll" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="System.Linq" #> 
<#@ output extension=".cs" #> 
<# 
     List<string> DataList = AccessInMemoryData(); 
#> 
using System; 
using System.Text; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace TestProject1 
{ 
[TestClass] 
public class UnitTest1 
{ 
    <# foreach (string currentTestString in DataList) { #> 
    [TestMethod] 
    public void TestingString_<#= currentTestString #> 
    { 
    string currentTestString = "<#= currentTestString #>"; 
    // TODO: Put your standard test code here which will use the string you created above 
    } 
    <# } #> 
} 
} 
+0

Đó là một ý tưởng gọn gàng. –

+0

Nghiêm túc yêu người đàn ông tiếp cận này! –

0

Tôi nghĩ rằng Gallio Ambience được cho là giải quyết vấn đề này. Tôi không chắc chắn trạng thái của dự án là gì, hiện tại.

1

I answered một similar question và giải pháp tôi đã sử dụng trước đây là tạo tệp CSV đơn giản từ dữ liệu bộ nhớ của tôi.

Các vấn đề liên quan