ปัญหาเกี่ยวกับแอตทริบิวต์ DeploymentItem


95

ฉันกำลังดูแลระบบ "เก่า" ที่เขียนด้วยภาษา C # .net ลบคุณลักษณะที่ล้าสมัยและทำการปรับโครงสร้างใหม่ ขอบคุณพระเจ้าชายคนก่อนเขียนแบบทดสอบหน่วย (MSTests) ฉันค่อนข้างพอใจกับการทดสอบ JUnit แต่ยังไม่ได้ทำ MSTests มากนัก

วิธีการทดสอบมีDeploymentItemแอตทริบิวต์ระบุไฟล์ข้อความซึ่งแยกวิเคราะห์โดยวิธีตรรกะทางธุรกิจที่กำลังทดสอบและลำดับที่ 2 DeploymentItemที่ระบุเพียงเส้นทางที่มีไฟล์ TIF จำนวนมากที่ต้องปรับใช้

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}

การทดสอบใช้งานได้ก่อนหน้านี้ แต่ตอนนี้ฉันต้องเปลี่ยนชื่อของไฟล์ TIF ที่อยู่ในไดเร็กทอรี \ files \ tif ตามกฎที่ชื่อไฟล์ TIF มีเพื่อให้ตรงกับรูปแบบบางอย่างซึ่งยังมีการตรวจสอบโดยExistsTifTest()วิธีการ ตอนนี้ฉันต้องเปลี่ยนชื่อไฟล์เพื่อปรับให้เข้ากับข้อกำหนดใหม่และไฟล์ TIF ก็ไม่ได้ถูกปรับใช้เหมือนเมื่อก่อน

ใครช่วยบอกฉันหน่อยได้ไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้นหรืออะไรอาจเป็นสาเหตุ สิ่งเดียวกันนี้จะเกิดขึ้นเช่นกันถ้าฉันเพิ่มไฟล์ข้อความใหม่พูดว่า "my2ndTest.txt" ข้าง "valid_entries.txt" ในไดเร็กทอรี \ files \ valid \ ด้วยแอตทริบิวต์ DeploymentItem ตามวิธีการทดสอบ ไฟล์ไม่ได้รับการปรับใช้?

ตอนนี้ฉันได้รับอิมเมจที่ใช้งานได้แล้วโดยกำหนดเส้นทางการปรับใช้โดยตรงใน testrunconfig แต่ฉันต้องการเข้าใจว่าเหตุใดสิ่งเหล่านี้จึงเกิดขึ้นหรือเหตุใดเช่นไฟล์ใหม่ "my2ndTest.txt" ของฉันจึงไม่ถูกทำให้ใช้งานได้ในขณะที่ไฟล์อื่นทำ


2
gotcha ใหญ่ที่นี่คือการตระหนักว่ารายการทั้งหมดที่ระบุใน DeploymentItemAttribute จะถูกคัดลอกไปยังตำแหน่งที่ชุดทดสอบของคุณทำงาน กล่าวอีกนัยหนึ่งถ้าคุณหวังว่ามันจะรักษาโครงสร้างไดเรกทอรีของคุณไว้คุณจะโชคไม่ดี หากคุณต้องการคัดลอกไปยังไดเร็กทอรีเฉพาะให้ใช้สองพารามิเตอร์ DeploymentItem (source, outputDir) เวอร์ชัน FYI - คุณสามารถไปโรงเรียนเก่าเพื่อค้นหาว่าไฟล์ถูกเรียกใช้สำหรับ MsTest ที่ไหนโดยการวาง System.Console.WriteLine (System.Environment.CurrentDirectory) ลงในการทดสอบของคุณ NCrunch ไม่มีปัญหานี้!
CodeMonkeyKing

คำตอบ:


112

DeploymentItem ค่อนข้างยุ่ง

แต่ละไฟล์ในโซลูชันของคุณจะมีการตั้งค่า "Copy To Output Folder" ใน VS.NET คุณต้องให้สิ่งนี้เป็น "Copy Always" (หรือคล้ายกัน) เพื่อรับไฟล์ไปยังโฟลเดอร์ผลลัพธ์

ตรวจสอบว่าคุณมีชุดนี้สำหรับไฟล์ใหม่ หากคุณไม่มีชุดนี้ไฟล์จะไม่ถูกคัดลอกไปยังโฟลเดอร์ผลลัพธ์และจะไม่สามารถปรับใช้จากโฟลเดอร์ผลลัพธ์ไปยังโฟลเดอร์ที่ MSTest ทำสิ่งต่างๆได้

โดยส่วนตัวแล้วถ้าฉันมีไฟล์ที่ต้องการสำหรับการทดสอบหน่วยของฉันฉันพบว่าการฝังไฟล์เหล่านั้นเป็นทรัพยากรในแอสเซมบลีและการมีแอสเซมบลีนั้น "แกะ" เองระหว่างการทดสอบเป็นวิธีที่คาดเดาได้ง่ายกว่า YMMV.

หมายเหตุ:ความคิดเห็นเหล่านี้มาจากประสบการณ์ของฉันกับ VS2010 ความคิดเห็นต่อคำตอบของฉันขอแนะนำว่านี่ไม่ใช่ปัญหากับ VS2012 ฉันยังคงยืนหยัดตามความคิดเห็นที่ว่าการใช้ทรัพยากรที่ฝังไว้นั้นเกี่ยวข้องกับ "เวทมนตร์" น้อยกว่าและสำหรับฉันแล้วทำให้ขั้นตอน "จัดเรียง" ของการทดสอบหน่วยของฉันมีความชัดเจนมากขึ้น


3
คัดลอกไปยังไดเรกทอรีผลลัพธ์จะไม่ส่งผลกระทบต่อการปรับใช้ไฟล์ MSTest คำตอบนี้ไม่ถูกต้อง
kzu

20
บน VS2010 Premium การเปลี่ยนแปลงนี้ (และไม่มีการเปลี่ยนแปลงอื่น ๆ ) ทำให้ไฟล์ใช้งานได้ ดังนั้นฉันจึงสรุปตามหลักฐานจริงว่ามีผลต่อการปรับใช้ MsTest
JonStonecash

1
เห็นด้วย ฉันเคยเห็นการเปลี่ยนแปลงครั้งเดียวนี้ DeploymentItem ขมวดคิ้วคว่ำ
Martin Peck

2
สิ่งนี้ดูเหมือนจะไม่จำเป็นอีกต่อไปใน VS2012 รายการการปรับใช้ของฉันกำลังปรับใช้โดยตั้งค่า "Copy To Output Folder" เป็น "Do Not Copy"
Mike

32
มันยอดเยี่ยมมากที่ DeploymentItem ไม่แจ้งให้คุณทราบเมื่อไม่สามารถคัดลอกไฟล์เดียวที่คุณให้มาได้

75

ใน VS2010 Local.testsettings ของฉันไม่ได้เลือก "Enable Deployment" และแอตทริบิวต์ DeploymentItem ไม่ทำงาน ฉันตรวจสอบแล้วและทุกอย่างทำงานได้ดี ฉันหวังว่านี่จะช่วยได้!


2
ฉันเอาหัวโขกกับกำแพงอิฐมานานแล้วที่พยายามทำให้มันใช้งานได้ .... ขอบคุณ!
mat-mcloughlin

12
ฉันคิดว่าคงจะดีไม่น้อยหากเฟรมเวิร์กออกคำเตือนว่าแอ็ตทริบิวต์ DeploymentItem ถูกละเว้นหากปิดการตั้งค่านี้ ฉันยังใส่ความประทับใจที่ดีลงในโต๊ะทำงานของฉัน
Alan McBee - MSFT

2
โปรดทราบว่า Local.testsettings อยู่ในรายการโซลูชัน
Matthew Lock

ฉันต้องเพิ่มไดเรกทอรีที่มีรายการที่ฉันต้องการปรับใช้ใน Local.testsettings ด้วย: i.imgur.com/p1z3m9R.png
Matthew Lock

การใช้ VS2017 ในปี 2018 การตรวจสอบ 'Enable Deployment' ยังคงเป็นวิธีแก้ปัญหาสำหรับปัญหานี้ และน่าเศร้าที่ตอนนี้ยังคงได้รับคำเตือนจาก Visual Studio ไม่ว่าอย่างไรก็ตาม ขอบคุณสำหรับการแก้ปัญหานี้
Don H

19

ฉันประสบปัญหาที่คล้ายกัน แต่ฉันพบวิธีแก้ปัญหาง่ายๆ 3 ขั้นตอนสำหรับสิ่งนี้:

สมมติว่าโครงสร้างโฟลเดอร์ของคุณมีลักษณะดังนี้: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. ไปที่ "Solutions Items / Local.testsettings"> "Deployment"> เลือก "Enable Deployment"
  2. หากคุณใช้ VS2010 ตรวจสอบให้แน่ใจว่าไฟล์ใด ๆ ที่คุณต้องการปรับใช้มีคุณสมบัติ "Copy To Output Folder" ที่ตั้งค่าเป็น "Copy Always" หรือ "Copy if Newer"
  3. ระบุ TestMethod ของคุณด้วยวิธีใดวิธีหนึ่ง:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]เพื่อปรับใช้เนื้อหาทั้งหมดของ<SubFolder>ไดเร็กทอรี Test Run
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")] เพื่อปรับใช้เนื้อหาทั้งหมดของ<SubFolder>to <TargetFolder>ในไดเร็กทอรี Test Run

หมายเหตุสุดท้ายเกี่ยวกับ MSTest (อย่างน้อยสำหรับ VS2010):

หากคุณต้องการ<TargetFolder>ให้มีชื่อเดียวกันกับการ<SubFolder>ใช้[DeploymentItem(@"SubFolder", @"SubFolder")]จะล้มเหลวอย่างเงียบ ๆ เนื่องจากนักวิ่ง MSTest โดนกรณีที่โง่เขลา นี่คือเหตุผลที่คุณควรนำหน้า<SubFolder>ด้วย<TestProjectFolder>ดังนี้:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]


หมายเหตุเกี่ยวกับความล้มเหลวในการตั้งชื่อ SubFolder เป็นอัญมณี
RJ Lohan

1
VS 2015 ดูเหมือนจะแตกต่างกันเล็กน้อย ฉันต้องการลบส่วน "TestPojectFolder" ในแอตทริบิวต์ DeploymentItem
uli78

15

เพื่อหวังว่าจะได้ช่วยเหลือคนอื่น: ฉันลองทำตามคำแนะนำทั้งหมดที่นี่แล้วแต่ก็ยังไม่ได้คัดลอกรายการการปรับใช้ของฉัน

สิ่งที่ฉันต้องทำ ( ตามที่แนะนำที่นี่ ) คือการเพิ่มพารามิเตอร์ที่สองให้กับแอตทริบิวต์ DeploymentItem:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]

10

หากคุณเข้าไปในไฟล์. testrunconfig และอยู่ในระหว่างการปรับใช้ให้ยกเลิกการเลือก "เปิดใช้งานการปรับใช้" การทดสอบจะทำงานในตำแหน่งปกติและทุกอย่างจะทำงานเหมือนเดิมเมื่อเรียกใช้แอปนอกการทดสอบหน่วย


มีปัญหาบางอย่างกับเรื่องนี้เช่นกัน ในฐานะ PM ฉันไม่สามารถเข้าถึงเครื่องมือทั้งหมดที่ dev ใช้ ในกรณีนี้ ReSharper คัดลอกไฟล์อย่างถูกต้องในขณะที่ MSTest ไม่สามารถทำได้ -> ฉันพบข้อผิดพลาดในขณะที่ dev ก็โอเค เปลี่ยนเป็น 'Test-> Edit Test Settings -> Local settings -> Deployment' รวมถึงไฟล์ที่เป็นปัญหาได้รับการแก้ไขสำหรับการใช้ MSTest ของฉัน
sonstabo

9

สิ่งนี้อาจไม่เกี่ยวข้องกับปัญหาที่แน่นอนของคุณ แต่นี่คือเคล็ดลับสองสามข้อที่ฉันพบในแอตทริบิวต์ [DeploymentItem]

  1. ควรตั้งค่า Copy to output directory เป็น Copy Always

มันไม่ทำงานเมื่อใช้กับแอตทริบิวต์ [TestInitialize]

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

ควรอยู่ใน [TestMethod] ของคุณเช่น

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }

1
นี่เป็นข้อ จำกัด ที่น่ารำคาญอย่างยิ่ง ฉันรู้สึกเหมือนหลาย ๆ กรณีเวลาในการปรับใช้ควรอยู่ในการเริ่มต้น จะเกิดอะไรขึ้นถ้าการทดสอบทั้งหมดของฉันใช้สิ่งประดิษฐ์ที่รองรับเดียวกัน ฉันเดาว่าฉันควรจะคัดลอกและวางมัณฑนากรในหลาย ๆ วิธีทดสอบ? ไร้สาระ.
Ryanman

5

หลังจากลองทำตามคำแนะนำอื่น ๆ ทั้งหมดที่ระบุไว้ที่นี่แล้วฉันก็ยังไม่เข้าใจว่าเกิดอะไรขึ้น ในที่สุดฉันก็พบว่าไม่มีไฟล์การตั้งค่าที่เลือกไว้ในเมนู Test / Test Settings ซึ่งหมายความว่าไม่ได้เปิดใช้งานการปรับใช้ ฉันคลิกรายการเมนู Test / Test Settings / Select Test Settings File เลือกไฟล์ Local.TestSettings จากนั้นทุกอย่างก็ใช้ได้


4

ไม่แน่ใจว่าสิ่งนี้ตอบคำถามได้ตรงประเด็นหรือไม่ แต่อาจช่วยได้บ้าง อันดับแรกฉันพบว่าต้องเลือกช่อง "เปิดใช้งานการทำให้ใช้งานได้" เพื่อให้ใช้งานได้ ประการที่สองเอกสารระบุว่าเส้นทางต้นทาง "สัมพันธ์กับเส้นทางโครงการ" ซึ่งในตอนแรกฉันใช้หมายถึงโฟลเดอร์โครงการ ในความเป็นจริงดูเหมือนว่าจะอ้างถึงโฟลเดอร์ build output ดังนั้นหากฉันมีโฟลเดอร์โปรเจ็กต์ชื่อ 'TestFiles' และมีไฟล์อยู่ในนั้นการTestdata.xmlใช้แอตทริบิวต์วิธีนี้จะไม่ได้ผล:

[DeploymentItem(@"TestFiles\Testdata.xml")] 

ฉันสามารถทำเครื่องหมายTestdata.xmlไฟล์Copy Alwaysเพื่อให้บิลด์วางสำเนาไว้ใต้โฟลเดอร์ผลลัพธ์ (เช่นDebug\TestFiles\TestData.xml) จากนั้นกลไกการปรับใช้จะค้นหาสำเนาของไฟล์ที่อยู่ในพา ธ นั้น ( TestFiles\Testdata.xml) ที่สัมพันธ์กับเอาต์พุตของบิลด์ หรือฉันสามารถตั้งค่าแอตทริบิวต์ด้วยวิธีนี้:

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

และกลไกการปรับใช้จะค้นหาไฟล์ต้นฉบับ ทั้งสองอย่างใช้งานได้ แต่ฉันสังเกตเห็นว่าการใช้Copy Alwaysบางครั้งฉันพบปัญหาเดียวกันกับที่ฉันพบเมื่อแก้ไขไฟล์ app.config ในโปรเจ็กต์ - ถ้าฉันไม่เปลี่ยนรหัสหรือบังคับให้สร้างใหม่ไม่มีอะไรที่ทริกเกอร์การคัดลอกไฟล์ที่ทำเครื่องหมายไว้ ถูกคัดลอกในการสร้าง


เส้นทางสัมพัทธ์เป็นปัญหาสำหรับฉันและสิ่งนี้ได้รับการแก้ไขแล้ว ฉันเพิ่มชุดคำสั่ง DeploymentItem 2 ชุดขึ้นอยู่กับวิธีการเรียกใช้การทดสอบ
Ed Bayiates

3

ฉันปิดใช้งานสถานะการทำให้ใช้งานได้ก่อน แต่ถึงแม้ว่าฉันจะเปิดใช้งานแล้ว แต่ด้วยเหตุผลที่ไม่ทราบสาเหตุก็ไม่มีการคัดลอกแม้แต่ DLLs เป้าหมายก็ตาม บังเอิญฉันเปิดหน้าต่าง Test Run และฆ่าการทำงานก่อนหน้านี้ทั้งหมดและฉันพบ DLL และไฟล์ทั้งหมดที่ฉันต้องการในโฟลเดอร์ทดสอบในการรันครั้งต่อไปอย่างน่าอัศจรรย์ ... สับสนมาก


3

อย่าใช้DeploymentItem.

มันยากมากที่จะตั้งค่าอย่างถูกต้องและมันใช้ไม่ได้กับนักวิ่งทดสอบ ReSharper ของฉันหรือแบบเนทีฟสำหรับ MSTEST ใน Visual Studio 2017

แต่ให้คลิกขวาแฟ้มข้อมูลของคุณและเลือกคุณสมบัติ เลือกคัดลอกไปยังไดเรกทอรีออก: เสมอ

ตอนนี้อยู่ในการทดสอบของคุณให้ทำสิ่งนี้ ไดเร็กทอรีเป็นไดเร็กทอรีของไฟล์ที่สัมพันธ์กับโปรเจ็กต์ทดสอบ ง่าย.

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

ดูเหมือนว่าจะทำงานได้ดีกับระบบสร้างและทดสอบอัตโนมัติ


2

ฉันประสบปัญหาใหญ่ในการพยายามรับไฟล์เพื่อปรับใช้ - ลองทำตามคำแนะนำทั้งหมดข้างต้น

จากนั้นฉันก็ปิด VS2010; รีสตาร์ทโหลดโซลูชันและทุกอย่างทำงาน (!)

ฉันตรวจสอบบ้าง หลังจากตั้งค่าสถานะ 'เปิดใช้งานการปรับใช้' บนโลคัลแล้วการตั้งค่าการทดสอบคุณไม่ควรเรียกใช้การทดสอบซ้ำจากหน้าต่างผลการทดสอบ คุณต้องนำการทดสอบก่อนหน้านี้ออกจาก UI เช่นโดยการเรียกใช้การทดสอบอื่นหรือโดยการเปิดโซลูชันของคุณใหม่


1

เนื่องจากฉันพบว่าแอตทริบิวต์ DeploymentItem ยุ่งอยู่เสมอฉันจึงทำการปรับใช้ไฟล์ดังกล่าวโดยใช้สคริปต์หลังการสร้าง - ตรวจสอบว่าไฟล์ที่คุณต้องการคัดลอกมีการตั้งค่าคุณสมบัติคัดลอกเสมอ - แก้ไขสคริปต์หลังการสร้างโครงการทดสอบของคุณเพื่อคัดลอกไฟล์จากโฟลเดอร์ build เป้าหมาย (Bin \ Debug) ไปยังตำแหน่งที่คุณคาดหวังการทดสอบ


1

ลองใช้กับ VS2010 ดังนั้นคุณไม่จำเป็นต้องเพิ่ม DeployItems สำหรับทุกครั้งที่
ลบไฟล์

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

เพิ่มการกำหนดค่าการทดสอบ
- คลิกขวาที่โหนดโซลูชันในตัวสำรวจโซลูชัน
- เพิ่ม -> รายการใหม่ ...
- เลือกโหนดการตั้งค่าการทดสอบทางด้านซ้ายเลือกรายการทางด้านขวา
- คลิกเพิ่ม

เรียกว่าเช่น TDD

เลือกTDDภายใต้>TestMenuEdit Testsettings

คลิกที่ Deployment เปิดใช้งานจากนั้นเพิ่มไฟล์และไดเร็กทอรีที่คุณต้องการจะมีเส้นทางที่สัมพันธ์กับโซลูชัน ไฟล์จะถูกใส่ ตัวอย่างไฟล์ต้นฉบับที่นี่:

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

เมื่อฉันเรียกใช้การทดสอบหน่วยของฉันมันจะถูกคัดลอกไป

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

ในรหัสทดสอบฉันเรียกมันจาก:

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

ไม่จำเป็นต้องเลือก Copy Always; ใส่ไฟล์ในโครงการทดสอบ เพิ่มพา ธ แบบฮาร์ดโค้ดในรหัสทดสอบ สำหรับฉันวิธีนี้ได้ผลดีที่สุด ฉันลองใช้ DeploymentItem คัดลอกเสมอ แต่ไม่เป็นที่ต้องการของฉัน


1

สำหรับผู้ที่ต้องการหลีกเลี่ยงความยุ่งเหยิงของ DeploymentItem และใช้แนวทางที่แนะนำโดย @Martin Peck (คำตอบที่ยอมรับ) คุณสามารถใช้รหัสต่อไปนี้เพื่อเข้าถึงเนื้อหาของทรัพยากรในตัว:

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

สำหรับรายละเอียดโปรดดูSO Thread นี้


1
ฉันมีปัญหากับ Assembly.GetExecutingAssembly () เมื่อรันบนเซิร์ฟเวอร์ build -> มันจะส่งคืนตัวทดสอบแทนการทดสอบจริง การประกอบโดยการสะท้อนออกจากประเภทคงที่ในชุดทดสอบ (เช่นคลาสทดสอบของคุณ) ช่วยแก้ปัญหานี้ให้ฉันได้
Arno Peters

1

สำหรับฉันสาเหตุที่แท้จริงคืออย่างอื่นทั้งหมด: รหัสการผลิตที่ใช้โดยการทดสอบของฉันกำลังเปลี่ยนชื่อและ / หรือลบไฟล์ทดสอบ. xml ที่กำลังปรับใช้

ดังนั้นเมื่อฉันเรียกใช้การทดสอบทีละรายการพวกเขาจะผ่าน แต่เมื่อเรียกใช้ทั้งหมดพร้อมกันการทดสอบครั้งที่ 2 และครั้งต่อ ๆ ไปจะล้มเหลวโดยมีข้อผิดพลาด "ไม่พบไฟล์" (ซึ่ง แต่เดิมฉันวินิจฉัยผิดเนื่องจากDeploymentItemแอตทริบิวต์ไม่ทำงาน)

วิธีแก้ปัญหาของฉันคือให้แต่ละวิธีทดสอบทำสำเนาของไฟล์ที่ปรับใช้ (โดยใช้เทคนิคนี้ ) จากนั้นให้ทดสอบรหัสการผลิตโดยใช้ไฟล์ที่คัดลอกแทนต้นฉบับ


1

เราใช้เวลาส่วนใหญ่กับปัญหาการปรับใช้ไอเท็มเพื่อแก้ปัญหานี้ในการรัน unittest แบบโลคัลและ teamcity unittest reun ด้วย มันไม่ง่ายเลย.

เครื่องมือที่ดีมากในการแก้ปัญหาเรื่องนี้เป็นProcessExplorer การใช้ process explorer คุณสามารถตรวจสอบได้ว่า Visual Studio ค้นหาไอเท็มการปรับใช้ที่ใดและทำการแก้ไขโปรเจ็กต์ เพียงกรองการทำงานของไฟล์ทั้งหมดที่พา ธ มีชื่อไฟล์ deploymentitem ของคุณแล้วคุณจะเห็นมัน


ฉันรู้ว่านี่เป็นคำตอบที่เก่ามาก แต่ถ้าคุณสามารถอธิบายได้อย่างละเอียดว่าคุณใช้ ProcessExplorer อย่างไรนั่นจะเป็นประโยชน์ ฉันไม่เห็นวิธีดูการทำงานของไฟล์เลยกรองน้อยลงมาก ...
David

1

นอกจากแอตทริบิวต์ Deployment ที่ต้องตรวจสอบแล้วฉันยังค้นพบอย่างอื่นเกี่ยวกับแอตทริบิวต์ DeploymentItem

[TestMethod()]
[DeploymentItem("folder\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

deploymentFile.txt ของคุณต้องสัมพันธ์กับไฟล์โซลูชันไม่ใช่ testfile.cs

ป้อนคำอธิบายภาพที่นี่


ในที่สุดฉันก็ทำงานนี้ได้โดยให้แหล่งที่มา DeploymentItem ของฉันสัมพันธ์กับโครงการทดสอบ ดังนั้นฉันจึงมีโครงการในโซลูชัน "Service.Tests" ในนั้นฉันมีโฟลเดอร์ "FilesForTests" ซึ่งมีไฟล์ที่ฉันต้องการคัดลอก ฉันใช้[DeploymentItem(@"FilesForTests\MyFile.txt", "FilesForTests")]. ฉันคิดว่าเรากำลังพูดในสิ่งเดียวกัน?
David

1

ฉันได้ดำเนินการเรื่องนี้ใน VS2013 การค้นพบของฉันเพื่อให้ได้ผล:

  • ควรตั้งค่า Copy to output directory เป็น Copy if Newer / Copy Always: MANDATORY
  • "เปิดใช้งานการทำให้ใช้งานได้" ใน. TestSettings: ไม่จำเป็น ฉันทำงานได้โดยไม่มีไฟล์. TestSettings เลย
  • การระบุโฟลเดอร์เป็นพารามิเตอร์ที่ 2: ไม่บังคับ กำหนดเค้าโครงโฟลเดอร์ผลลัพธ์ทำงานได้ดีโดยไม่ต้อง
  • SPACES ในชื่อไฟล์: สิ่งนี้ทำให้ฉันปวดหัว - ไฟล์ไม่เคยถูกคัดลอก การลบช่องว่างแก้ไขสิ่งนี้ ยังไม่ได้ดูอักขระหนี

เคล็ดลับที่ฉันได้เรียนรู้วิธีที่ยาก: อย่าลืมเพิ่มแอตทริบิวต์นี้ในการทดสอบแต่ละครั้ง ไฟล์จะคัดลอกในการทดสอบที่มาจากการทดสอบครั้งแรกในการทดสอบ แต่ยังคงหายไปเมื่อลำดับของการทดสอบเปลี่ยนไปและการทดสอบที่ไม่ได้ระบุแหล่งที่มาจะพยายามค้นหาไฟล์ก่อน


พยายามทุกอย่างที่นี่ก่อนที่จะได้รับคำตอบซึ่งเป็นคำตอบสุดท้าย ผู้ร้าย: เว้นวรรคใน FILENAME! คำบรรยายภาพที่ดี
joelmdev

1
ใช้ Visual Studio 2019 "คัดลอกถ้าใหม่กว่า" แก้ไขได้ ฉันเกลียด "คัดลอกเสมอ" เพราะมันบังคับให้โครงการสร้างใหม่ในหลายสถานการณ์เช่นการดีบักหรือการสร้างแบบเพิ่มหน่วย
Gerardo Grignoli

เห็นด้วย ฉันได้อัปเดตคำตอบของฉันเพื่อรวม Copy ถ้าใหม่กว่า
Arno Peters

0

"gotcha" ขนาดใหญ่ของฉันเป็นวิธีที่ DeploymentItem จัดการกับไดเรกทอรี ฉันใช้เวอร์ชันสองพารามิเตอร์กับทั้งสองเป็นพา ธ ไดเร็กทอรีที่มีไดเร็กทอรีย่อยที่ฉันต้องการปรับใช้ ฉันไม่ทราบในตอนแรกว่ามันคัดลอกเฉพาะสิ่งต่างๆใน ROOT ของไดเร็กทอรีไม่ใช่โครงสร้างโฟลเดอร์แบบวนซ้ำทั้งหมด!

โดยพื้นฐานแล้วฉันมี [DeploymentItem (@ "Foo \", @ "Foo \")] และคาดหวังว่ามันจะทำให้ Foo \ Bar ของฉันใช้งานได้ ฉันต้องเปลี่ยนเป็น [DeploymentItem (@ "Foo \ Bar \", @ "Foo \ Bar \")] โดยเฉพาะและตอนนี้มันก็ใช้งานได้ดี


0

ฉันก็ประสบปัญหาคล้าย ๆ กัน ฉันมีขั้นตอนทั้งหมดที่กล่าวมาแล้ว แต่ยังไม่มีโชค ฉันใช้ VS2010 แล้วฉันได้พบว่า$ เมนู> ทดสอบ> เลือกทดสอบการตั้งค่าการใช้งาน> ติดตามและผลกระทบต่อการทดสอบ ได้รับการคัดเลือก มันเริ่มทำงานหลังจากที่ผมเปลี่ยนการติดตามและการทดสอบผลกระทบต่อท้องถิ่น หน้านี้มีข้อมูลที่เป็นประโยชน์มากเกี่ยวกับการคัดลอกไฟล์ไปยังโฟลเดอร์ผลการทดสอบฉันรู้สึกว่าจะเพิ่มประสบการณ์นี้ด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.