2014-05-14 23 views
18

Tôi bắt đầu viết một bài kiểm tra đơn vị (MS Test, với Resharper làm á hậu kiểm tra). Khi tôi đặt LogicalThreadContext (xem bên dưới), các trường hợp thử nghiệm của tôi bị 'hủy bỏ'. Ai biết tại sao? Điều này có liên quan đến việc kiểm tra đơn vị đang ở trên một chủ đề khác không? Làm cách nào để giải quyết vấn đề này?log4net - LogicalThreadContext - và các trường hợp kiểm tra đơn vị

[TestClass] 
public class ContextInfoTest 
{ 
    private ILog _log; 


    [TestInitialize] 
    public void TestInitialize() 
    { 
     // logging configured in assembly.info 
     _log = LogManager.GetLogger(this.GetType()); 
    } 


    [TestMethod] 
    public void FigureOutWhyAborting() 
    { 
     string input = "blah"; 
     LogicalThreadContext.Properties["mypropertyname"] = input; 

     string output = LogicalThreadContext.Properties["mypropertyname"] as string; 
     Assert.AreEqual(input, output); 
    } 


    [TestMethod] 
    public void ThisWorks() 
    { 
     string input = "blah"; 
     CallContext.LogicalSetData("mypropertyname", input); 

     string output = CallContext.LogicalGetData("mypropertyname") as string; 
     Assert.AreEqual(input, output); 
    } 

Điều kỳ lạ là nếu tôi được gỡ lỗi và bước qua mã, Assert.AreEqual không được gọi và vượt qua, vì vậy một cái gì đó đang xảy ra sau đó dòng mã ... đó là lý do tại sao tôi nghĩ rằng nó có thể có liên quan đến chuỗi thử nghiệm, v.v.

Cảm ơn!

UPDATE: Vì vậy, tôi chạy thử nghiệm này trong MSTest và có ngoại lệ này (Resharper không hiển thị nó)

Unit Test Adaptor ném ngoại lệ: Loại không được giải quyết cho thành viên 'log4net.Util.PropertiesDictionary, log4net, Phiên bản = 1.2.13.0, Văn hóa = trung lập, PublicKeyToken = 669e0ddf0bb1aa2a '..

Tôi đang sử dụng log4net v1.2.13, trên VS2013, .Net 4.5.

Liên kết này dường như đề xuất nó là một vấn đề hội đồng tham chiếu, nhưng không có độ phân giải. Bất kỳ ý tưởng bổ sung nào cũng sẽ được hoan nghênh rất nhiều, GAC'ing log4net không phải là một lựa chọn. https://issues.apache.org/jira/browse/LOG4NET-398

+1

hoạt động tốt cho tôi (cả chạy và gỡ lỗi thử nghiệm) nhưng tôi không sử dụng reSharper. Có lẽ thử chạy chúng trực tiếp từ VS không thông qua ReShaper – ManyRootsofAllEvil

Trả lời

26

tôi đã kết thúc làm điều này để làm cho nó làm việc:

đặt này trong) phương pháp TestCleanup (:

CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties"); 
+1

bằng cách nào đó này hoạt động, nhưng không phải lúc nào. Vì một số lý do, mà tôi không biết, một vài xét nghiệm vẫn còn ném lỗi. – JobaDiniz

+0

Một nơi nào đó sâu trong mã của tôi, tôi thấy rằng chúng tôi đã sử dụng log4net LogicalThreadContext để thiết lập thuộc tính, dường như một dòng này đã gây ra sự cố. Giải phóng khe dữ liệu được đặt tên phù hợp với tôi, mặc dù tôi đang điều tra xem chúng tôi có thể xóa hoàn toàn dòng đó hay không. Nếu chúng tôi có những vấn đề này trong thử nghiệm, tôi tự hỏi nếu nó sẽ cung cấp cho các tác dụng phụ trong sản xuất. – Erik

1

Vì vậy, tôi không thể cảm ơn đủ cho figuring this out để gọi FreeNamedDataSlot. Điều này đã khiến tôi trở thành câu trả lời của tôi. Thay vì đi qua trong không gian tên đầy đủ của lớp, tôi chỉ phải sử dụng tên lớp:

này đã được sử dụng ở đâu đó sâu trong tôi Data Access Layer:

MySession session = (MySession)System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("MySession"); 

[TestCleanup] 
public void Cleanup() 
{ 
    CallContext.FreeNamedDataSlot("MySession"); 
} 

này làm việc hoàn hảo đối với tôi! Hy vọng rằng điều này sẽ giúp người khác khi sử dụng môi trường Test của Visual Studio.

-5

Cảm ơn tất cả những lời khuyên, tôi cố gắng với:

[TestCleanup] 
public void Cleanup() 
{ 
    CallContext.FreeNamedDataSlot("log4net.Util.LogicalThreadContextProperties"); 
} 

Và hoạt động !!

+0

điều này cần phải được thêm vào làm bình luận cho câu trả lời được chấp nhận – Shevek

+1

Có lẽ, nhưng nó đã giúp tôi một cách nhanh chóng như nó được. :) – galmok

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